// bdlde_utf8checkinginstreambufwrapper.t.cpp                         -*-C++-*-

// ----------------------------------------------------------------------------
//                                  TEST PLAN
// ----------------------------------------------------------------------------
// [ 8] int_type sputbackc(char_type);
// [ 8] int_type sungetc();
// [ 5] size_t sputn(const char *, size_t);
// [ 5] int sputc(char);
// [ 4]  const char toAscii(int);
// [ 3] Utf8CheckingInStreamBufWrapper();
// [ 3] Utf8CheckingInStreamBufWrapper(bslma::Allocator *);
// [ 3] Utf8CheckingInStreamBufWrapper(streambuf *);
// [ 3] Utf8CheckingInStreamBufWrapper(streambuf *, bslma::Allocator *);
// [ 3] ~Utf8CheckingInStreamBufWrapper();
// [ 3] reset(bsl::streambuf *);
// [ 3] isValid() const;
// [ 2] size_t sgetn(char *, size_t);
// [ 2] pos_type pubseekoff(off_type, seekdir, openmode);
// [ 2] pos_type pubseekpos(pos_type, openmode);
// [ 2] int_type sbumpc();
// [ 2] int errorStatus() const;
// [ 2] bool isValid() const;
// ----------------------------------------------------------------------------
// [ 1] BREATHING TEST
// [ 6] VALID UTF8 TEST
// [ 7] BROKEN GLASS TEST
// [ 9] HOLDING SEEKLESS STREAMBUF TEST
// [10] USAGE EXAMPLE
// ----------------------------------------------------------------------------

#include <bdlde_utf8checkinginstreambufwrapper.h>
#include <bdlde_utf8util.h>

#include <bdlsb_fixedmeminstreambuf.h>

#include <bslma_defaultallocatorguard.h>
#include <bslma_testallocator.h>
#include <bslim_testutil.h>
#include <bsls_types.h>

#include <bsl_algorithm.h>
#include <bsl_iostream.h>
#include <bsl_string.h>

#include <bsl_cstdio.h>
#include <bsl_cstdlib.h>
#include <bsl_cstring.h>

#include <bsl_cctype.h>

#include <sys/types.h>
#include <sys/stat.h>

using namespace BloombergLP;
using bsl::cout;
using bsl::cerr;
using bsl::endl;
using bsl::flush;
using bsl::size_t;

// ============================================================================
//                     STANDARD BDE ASSERT TEST FUNCTION
// ----------------------------------------------------------------------------

namespace {

int testStatus = 0;

void aSsErT(bool condition, const char *message, int line)
{
    if (condition) {
        cout << "Error " __FILE__ "(" << line << "): " << message
             << "    (failed)" << endl;

        if (0 <= testStatus && testStatus <= 100) {
            ++testStatus;
        }
    }
}

}  // close unnamed namespace

// ============================================================================
//               STANDARD BDE TEST DRIVER MACRO ABBREVIATIONS
// ----------------------------------------------------------------------------

#define ASSERT       BSLIM_TESTUTIL_ASSERT
#define ASSERTV      BSLIM_TESTUTIL_ASSERTV

#define Q            BSLIM_TESTUTIL_Q   // Quote identifier literally.
#define P            BSLIM_TESTUTIL_P   // Print identifier and value.
#define P_           BSLIM_TESTUTIL_P_  // P(X) without '\n'.
#define T_           BSLIM_TESTUTIL_T_  // Print a tab (w/o newline).
#define L_           BSLIM_TESTUTIL_L_  // current Line number

// ============================================================================
//                    GLOBAL HELPER #DEFINES FOR TESTING
// ----------------------------------------------------------------------------

// ============================================================================
//                 GLOBAL HELPER TYPES & CLASSES FOR TESTING
// ----------------------------------------------------------------------------

typedef bdlde::Utf8CheckingInStreamBufWrapper Obj;
typedef bdlde::Utf8Util                       Util;
typedef bsls::Types::IntPtr                   IntPtr;
typedef bdlsb::FixedMemInStreamBuf            FSB;
typedef bsl::streambuf::off_type              OT;
typedef bsl::streambuf::pos_type              PT;

namespace {
namespace u {

                            // ===========================
                            // SeekLessFixedMemInStreamBuf
                            // ===========================

class SeekLessFixedMemInStreamBuf : public FSB {
  protected:
    // PROTECTED MANIPULATORS

    /// Not supported.  Unconditionally return a negative value.
    pos_type seekoff(off_type                ,
                     bsl::ios_base::seekdir  ,
                     bsl::ios_base::openmode ) BSLS_KEYWORD_OVERRIDE;

    /// Not supported.  Unconditionally return a negative value.
    pos_type seekpos(pos_type                ,
                     bsl::ios_base::openmode ) BSLS_KEYWORD_OVERRIDE;

  public:
    // CREATORS

    /// Create a `SeekLessFixedMemInStreamBuf` that provides access to the
    /// character sequence in the specified `buffer` of the specified
    /// `length`.  The behavior is undefined unless
    /// `buffer != 0 && length > 0` or `length == 0`.
    SeekLessFixedMemInStreamBuf(const char *buffer, bsl::size_t length);
};

                            // ---------------------------
                            // SeekLessFixedMemInStreamBuf
                            // ---------------------------


SeekLessFixedMemInStreamBuf::pos_type
SeekLessFixedMemInStreamBuf::seekoff(off_type                ,
                                     bsl::ios_base::seekdir  ,
                                     bsl::ios_base::openmode )
{
    return pos_type(-100 * 1000);
}

SeekLessFixedMemInStreamBuf::pos_type
SeekLessFixedMemInStreamBuf::seekpos(pos_type                ,
                                     bsl::ios_base::openmode )
{
    return pos_type(-1000 * 1000);
}

SeekLessFixedMemInStreamBuf::SeekLessFixedMemInStreamBuf(
                                        const char *buffer, bsl::size_t length)
: FixedMemInStreamBuf(buffer, length)
{}

}  // close namespace u
}  // close unnamed namespace

// ============================================================================
//                GLOBAL HELPER VARIABLES AND FUNCTIONS FOR TESTING
// ----------------------------------------------------------------------------

bool verbose;
bool veryVerbose;
bool veryVeryVerbose;
bool veryVeryVeryVerbose;
bool veryVeryVeryVeryVerbose;
bool veryVeryVeryVeryVeryVerbose;

const PT ptZero(0);

namespace {
namespace u {

static unsigned char utf8MultiLang[] = {
    239,  187, 191,  'C', 'h', 'i',  'n',  'e', 's', 'e', ':',  13,  10,  13,
    10,   228, 184,  173, 229, 141,  142,  228, 186, 186, 230,  176, 145, 229,
    133,  177, 229,  146, 140, 229,  155,  189, 239, 188, 140,  233, 128, 154,
    231,  167, 176,  228, 184, 173,  229,  155, 189, '[', 230,  179, 168, ' ',
    '3',  ']', 239,  188, 140, 230,  152,  175, 228, 189, 141,  230, 150, 188,
    228,  186, 154,  230, 180, 178,  230,  157, 177, 233, 131,  168, 227, 128,
    129,  229, 164,  170, 229, 185,  179,  230, 180, 139, 232,  165, 191, 229,
    178,  184, 231,  154, 132, 228,  184,  128, 228, 184, 170,  231, 164, 190,
    228,  188, 154,  228, 184, 187,  228,  185, 137, 229, 155,  189, 229, 174,
    182,  227, 128,  130, 233, 166,  150,  233, 131, 189, 231,  130, 186, 229,
    140,  151, 228,  186, 172, 227,  128,  130, 229, 133, 182,  233, 153, 134,
    229,  156, 176,  231, 150, 134,  229,  159, 159, 232, 136,  135, 229, 145,
    168,  233, 130,  138, '1', '4',  229,  128, 139, 229, 156,  139, 229, 174,
    182,  230, 142,  165, 229, 163,  164,  239, 188, 140, 233,  153, 134, 229,
    156,  176, 229,  143, 138, 230,  185,  150, 230, 179, 138,  231, 154, 132,
    230,  128, 187,  233, 157, 162,  231,  169, 141, 231, 186,  166, '9', '6',
    '0',  232, 144,  172, 229, 185,  179,  230, 150, 185, 229,  133, 172, 233,
    135,  140, '[',  '1', '1', ']',  '[',  '1', '2', ']', '[',  '1', '3', ']',
    239,  188, 140,  230, 152, 175,  229,  133, 168, 228, 184,  150, 231, 149,
    140,  233, 153,  134, 229, 156,  176,  233, 157, 162, 231,  167, 175, 231,
    172,  172, 228,  186, 140, 229,  164,  167, 231, 154, 132,  229, 155, 189,
    229,  174, 182,  239, 188, 140,  230,  128, 187, 233, 157,  162, 231, 167,
    175,  231, 172,  172, 228, 184,  137,  230, 136, 150, 231,  172, 172, 229,
    155,  155, 229,  164, 167, 231,  154,  132, 229, 155, 189,  229, 174, 182,
    227,  128, 130,  229, 133, 182,  228,  186, 186, 229, 143,  163, 232, 182,
    133,  233, 129,  142, '1', '3',  229,  132, 132, 239, 188,  140, 231, 180,
    132,  228, 189,  148, 229, 133,  168,  231, 144, 131, 228,  186, 186, 229,
    143,  163, 231,  154, 132, 228,  186,  148, 229, 136, 134,  228, 185, 139,
    228,  184, 128,  239, 188, 140,  230,  152, 175, 228, 184,  150, 231, 149,
    140,  228, 184,  138, 228, 186,  186,  229, 143, 163, 230,  156, 128, 229,
    164,  154, 231,  154, 132, 229,  156,  139, 229, 174, 182,  227, 128, 130,
    13,   10,  13,   10,  228, 189,  156,  231, 130, 186, 231,  164, 190, 228,
    188,  154, 228,  184, 187, 228,  185,  137, 229, 155, 189,  229, 174, 182,
    239,  188, 140,  228, 184, 173,  232,  143, 175, 228, 186,  186, 230, 176,
    145,  229, 133,  177, 229, 146,  140,  229, 156, 139, 228,  187, 165, 233,
    169,  172, 229,  133, 139, 230,  128,  157, 229, 136, 151,  229, 174, 129,
    228,  184, 187,  228, 185, 137,  231,  130, 186, 230, 132,  143, 232, 173,
    152,  229, 189,  162, 230, 133,  139,  239, 188, 140, 228,  190, 157, 228,
    184,  173, 229,  156, 139, 231,  137,  185, 232, 137, 178,  231, 164, 190,
    230,  156, 131,  228, 184, 187,  231,  190, 169, 231, 144,  134, 232, 174,
    186,  230, 140,  135, 229, 176,  142,  230, 148, 191, 228,  186, 139, 239,
    188,  140, 229,  185, 182, 231,  148,  177, 230, 134, 178,  230, 179, 149,
    230,  137, 128,  232, 179, 166,  228,  186, 136, 228, 184,  173, 229, 155,
    189,  229, 133,  177, 228, 186,  167,  229, 133, 154, 229,  159, 183, 230,
    148,  191, 239,  188, 140, 229,  174,  158, 232, 161, 140,  228, 184, 173,
    229,  155, 189,  229, 133, 177,  228,  186, 167, 229, 133,  154, 233, 162,
    134,  229, 175,  188, 231, 154,  132,  229, 164, 154, 229,  133, 154, 229,
    144,  136, 228,  189, 156, 229,  146,  140, 230, 148, 191,  230, 178, 187,
    229,  141, 143,  229, 149, 134,  229,  136, 182, 229, 186,  166, '[', '1',
    '4',  ']', 227,  128, 130, '1',  '9',  '4', '9', 229, 185,  180, '1', '0',
    230,  156, 136,  '1', 230, 151,  165,  231, 154, 132, 229,  188, 128, 229,
    155,  189, 229,  164, 167, 229,  133,  184, 228, 184, 173,  239, 188, 140,
    228,  184, 173,  229, 141, 142,  228,  186, 186, 230, 176,  145, 229, 133,
    177,  229, 146,  140, 229, 155,  189,  228, 184, 173, 229,  164, 174, 228,
    186,  186, 230,  176, 145, 230,  148,  191, 229, 186, 156,  230, 173, 163,
    229,  188, 143,  229, 174, 163,  229,  145, 138, 230, 136,  144, 231, 171,
    139,  '[', 230,  179, 168, ' ',  '4',  ']', 227, 128, 130,  229, 133, 168,
    229,  156, 139,  229, 138, 131,  229,  136, 134, 231, 130,  186, '2', '3',
    229,  128, 139,  231, 156, 129,  239,  188, 136, 229, 133,  182, 228, 184,
    173,  229, 185,  182, 230, 178,  161,  230, 156, 137, 229,  175, 185, 229,
    143,  176, 230,  185, 190, 231,  156,  129, 229, 133, 168,  233, 131, 168,
    228,  184, 142,  231, 166, 143,  229,  187, 186, 231, 156,  129, 227, 128,
    129,  230, 181,  183, 229, 141,  151,  231, 156, 129, 233,  131, 168, 229,
    136,  134, 229,  156, 176, 229,  140,  186, 229, 174, 158,  233, 153, 133,
    231,  174, 161,  232, 190, 150,  239,  188, 137, 227, 128,  129, '5', 229,
    128,  139, 232,  135, 170, 230,  178,  187, 229, 141, 128,  227, 128, 129,
    '4',  229, 128,  139, 231, 155,  180,  232, 190, 150, 229,  184, 130, 229,
    146,  140, '2',  229, 128, 139,  231,  137, 185, 229, 136,  165, 232, 161,
    140,  230, 148,  191, 229, 140,  186,  239, 188, 136, 229,  141, 179, 233,
    166,  153, 230,  184, 175, 232,  136,  135, 230, 190, 179,  233, 150, 128,
    239,  188, 137,  239, 188, 140,  231,  156, 129, 231, 186,  167, 228, 186,
    186,  230, 176,  145, 230, 148,  191,  229, 186, 156, 229,  143, 151, 229,
    155,  189, 229,  138, 161, 233,  153,  162, 233, 162, 134,  229, 175, 188,
    239,  188, 140,  231, 137, 185,  229,  136, 165, 232, 161,  140, 230, 148,
    191,  229, 141,  128, 229, 137,  135,  230, 160, 185, 230,  147, 154, 228,
    184,  128, 229,  156, 139, 229,  133,  169, 229, 136, 182,  230, 148, 191,
    231,  173, 150,  229, 175, 166,  232,  161, 140, 233, 171,  152, 229, 186,
    166,  232, 135,  170, 230, 178,  187,  227, 128, 130, 229,  133, 168, 229,
    155,  189, 232,  183, 168, 232,  182,  138, 228, 186, 148,  228, 184, 170,
    229,  156, 176,  231, 144, 134,  230,  151, 182, 229, 140,  186, 239, 188,
    140,  228, 189,  134, 229, 157,  135,  228, 189, 191, 231,  148, 168, 228,
    184,  173, 229,  156, 139, 230,  168,  153, 230, 186, 150,  230, 153, 130,
    233,  150, 147,  239, 188, 136,  229,  141, 179, 'U', 'T',  'C', '+', '8',
    239,  188, 137,  227, 128, 130,  13,   10,  13,  10,  228,  184, 173, 232,
    143,  175, 228,  186, 186, 230,  176,  145, 229, 133, 177,  229, 146, 140,
    229,  156, 139,  230, 152, 175,  229,  164, 154, 230, 176,  145, 230, 151,
    143,  229, 155,  189, 229, 174,  182,  239, 188, 140, 229,  133, 182, 228,
    184,  173, 230,  177, 137, 230,  151,  143, 228, 189, 148,  231, 184, 189,
    228,  186, 186,  229, 143, 163,  231,  154, 132, '9', '1',  '.', '5', '9',
    '%',  239, 188,  140, 229, 133,  182,  233, 164, 152, '5',  '5', 228, 184,
    170,  230, 176,  145, 230, 151,  143,  231, 130, 186, 229,  176, 145, 230,
    149,  176, 230,  176, 145, 230,  151,  143, 239, 188, 140,  229, 155, 189,
    229,  174, 182,  232, 170, 141,  229,  174, 154, 231, 154,  132, '5', '6',
    229,  128, 139,  230, 176, 145,  230,  151, 143, 229, 144,  136, 231, 167,
    176,  226, 128,  156, 228, 184,  173,  229, 141, 142, 230,  176, 145, 230,
    151,  143, 226,  128, 157, 227,  128,  130, 228, 184, 173,  229, 141, 142,
    228,  186, 186,  230, 176, 145,  229,  133, 177, 229, 146,  140, 229, 155,
    189,  230, 156,  137, '2', '4',  231,  167, 141, 230, 176,  145, 230, 151,
    143,  230, 150,  135, 229, 173,  151,  239, 188, 140, 229,  133, 171, 229,
    141,  129, 229,  164, 154, 231,  167,  141, 230, 176, 145,  230, 151, 143,
    232,  175, 173,  232, 168, 128,  227,  128, 130, 228, 184,  173, 229, 141,
    142,  228, 186,  186, 230, 176,  145,  229, 133, 177, 229,  146, 140, 229,
    155,  189, 230,  178, 161, 230,  156,  137, 230, 152, 142,  231, 161, 174,
    232,  167, 132,  229, 174, 154,  231,  154, 132, 229, 155,  189, 229, 174,
    182,  232, 175,  173, 232, 168,  128,  239, 188, 140, 228,  187, 165, 230,
    177,  137, 232,  175, 173, 230,  153,  174, 233, 128, 154,  232, 175, 157,
    229,  146, 140,  232, 167, 132,  232,  140, 131, 231, 174,  128, 229, 140,
    150,  230, 177,  137, 229, 173,  151,  228, 184, 186, 226,  128, 156, 229,
    155,  189, 229,  174, 182, 233,  128,  154, 231, 148, 168,  232, 175, 173,
    232,  168, 128,  230, 150, 135,  229,  173, 151, 226, 128,  157, '[', 230,
    179,  168, ' ',  '5', ']', 227,  128,  130, 228, 184, 173,  229, 155, 189,
    228,  188, 160,  231, 187, 159,  228,  184, 138, 230, 152,  175, 228, 187,
    165,  231, 165,  150, 229, 133,  136,  228, 191, 161, 228,  187, 176, 228,
    184,  186, 228,  184, 187, 231,  154,  132, 229, 155, 189,  229, 174, 182,
    239,  188, 140,  229, 185, 182,  229,  133, 183, 230, 156,  137, 229, 132,
    146,  233, 135,  138, 233, 129,  147,  228, 184, 137, 230,  149, 153, 229,
    144,  136, 230,  181, 129, 231,  154,  132, 229, 174, 151,  230, 149, 153,
    228,  191, 161,  228, 187, 176,  228,  188, 160, 231, 187,  159, 229, 146,
    140,  231, 137,  185, 231, 130,  185,  239, 188, 140, 229,  144, 140, 230,
    151,  182, 229,  173, 152, 229,  156,  168, 229, 133, 182,  229, 174, 131,
    229,  164, 154,  231, 167, 141,  229,  174, 151, 230, 149,  153, 227, 128,
    130,  228, 184,  173, 229, 141,  142,  228, 186, 186, 230,  176, 145, 229,
    133,  177, 229,  146, 140, 229,  155,  189, 229, 144, 142,  239, 188, 140,
    229,  174, 152,  230, 150, 185,  229,  165, 137, 232, 161,  140, 230, 151,
    160,  231, 165,  158, 232, 174,  186,  239, 188, 140, 229,  133, 182, 229,
    144,  142, 230,  155, 190, 229,  143,  145, 229, 138, 168,  231, 154, 132,
    230,  150, 135,  229, 140, 150,  229,  164, 167, 233, 157,  169, 229, 145,
    189,  229, 175,  185, 229, 144,  132,  231, 167, 141, 229,  174, 151, 230,
    149,  153, 233,  128, 160, 230,  136,  144, 228, 184, 165,  233, 135, 141,
    231,  160, 180,  229, 157, 143,  239,  188, 140, 231, 155,  180, 229, 136,
    176,  230, 148,  185, 233, 157,  169,  229, 188, 128, 230,  148, 190, 229,
    144,  142, 230,  137, 141, 230,  156,  137, 230, 137, 128,  232, 189, 172,
    229,  143, 152,  227, 128, 130,  229,  189, 147, 228, 187,  138, 228, 184,
    173,  229, 155,  189, 230, 148,  191,  229, 186, 156, 229,  175, 185, 229,
    174,  151, 230,  149, 153, 228,  184,  142, 228, 188, 160,  231, 187, 159,
    228,  186, 139,  231, 137, 169,  233,  135, 135, 229, 143,  150, 228, 191,
    157,  230, 138,  164, 231, 154,  132,  230, 128, 129, 229,  186, 166, 227,
    128,  130, 13,   10,  13,  10,   228,  184, 173, 229, 141,  142, 228, 186,
    186,  230, 176,  145, 229, 133,  177,  229, 146, 140, 229,  155, 189, 230,
    152,  175, 229,  155, 189, 233,  153,  133, 231, 164, 190,  228, 188, 154,
    231,  154, 132,  233, 135, 141,  232,  166, 129, 228, 184,  128, 229, 145,
    152,  239, 188,  140, 228, 185,  159,  230, 152, 175, 228,  188, 151, 229,
    164,  154, 230,  173, 163, 229,  188,  143, 229, 146, 140,  233, 157, 158,
    230,  173, 163,  229, 188, 143,  231,  154, 132, 229, 164,  154, 232, 190,
    185,  231, 187,  132, 231, 187,  135,  231, 154, 132, 230,  136, 144, 229,
    145,  152, 239,  188, 140, 229,  140,  133, 230, 139, 172,  232, 129, 148,
    229,  144, 136,  229, 155, 189,  227,  128, 129, 228, 184,  150, 231, 149,
    140,  232, 180,  184, 230, 152,  147,  231, 187, 132, 231,  187, 135, 227,
    128,  129, 228,  186, 154, 229,  164,  170, 231, 187, 143,  229, 144, 136,
    231,  187, 132,  231, 187, 135,  227,  128, 129, 233, 135,  145, 231, 160,
    150,  229, 155,  155, 229, 155,  189,  227, 128, 129, 228,  184, 138, 230,
    181,  183, 229,  144, 136, 228,  189,  156, 231, 187, 132,  231, 187, 135,
    229,  146, 140,  '2', '0', 229,  155,  189, 233, 155, 134,  229, 155, 162,
    231,  173, 137,  239, 188, 140,  228,  184, 186, 232, 129,  148, 229, 144,
    136,  229, 155,  189, 229, 174,  137,  229, 133, 168, 231,  144, 134, 228,
    186,  139, 228,  188, 154, 229,  184,  184, 228, 187, 187,  231, 144, 134,
    228,  186, 139,  229, 155, 189,  227,  128, 129, 228, 184,  150, 231, 149,
    140,  231, 172,  172, 228, 186,  140,  229, 164, 167, 231,  187, 143, 230,
    181,  142, 228,  189, 147, 239,  188,  140, 230, 152, 175,  228, 184, 150,
    231,  149, 140,  231, 172, 172,  228,  184, 128, 229, 164,  167, 229, 135,
    186,  229, 143,  163, 229, 156,  139,  227, 128, 129, 228,  184, 150, 231,
    149,  140, 231,  172, 172, 228,  186,  140, 229, 164, 167,  233, 128, 178,
    229,  143, 163,  229, 156, 139,  239,  188, 140, 230, 147,  129, 230, 156,
    137,  230, 156,  128, 229, 164,  154,  231, 154, 132, 229,  164, 150, 230,
    177,  135, 229,  132, 178, 229,  130,  153, 239, 188, 140,  230, 156, 128,
    228,  184, 176,  229, 175, 140,  231,  154, 132, 228, 184,  150, 231, 149,
    140,  230, 150,  135, 229, 140,  150,  233, 129, 151, 228,  186, 167, 239,
    188,  140, 228,  186, 166, 230,  152,  175, 228, 184, 150,  231, 149, 140,
    228,  184, 138,  231, 187, 143,  230,  181, 142, 230, 136,  144, 233, 149,
    183,  230, 156,  128, 229, 191,  171,  231, 154, 132, 229,  156, 139, 229,
    174,  182, 228,  185, 139, 228,  184,  128, 227, 128, 130,  229, 143, 166,
    229,  164, 150,  239, 188, 140,  228,  184, 173, 229, 155,  189, 230, 139,
    165,  230, 156,  137, 228, 184,  150,  231, 149, 140, 228,  184, 138, 231,
    142,  176, 229,  189, 185, 229,  163,  171, 229, 133, 181,  230, 156, 128,
    229,  164, 154,  231, 154, 132,  229,  134, 155, 233, 152,  159, 239, 188,
    155,  229, 134,  155, 228, 186,  139,  229, 188, 128, 230,  148, 175, 228,
    184,  150, 231,  149, 140, 231,  172,  172, 228, 186, 140,  239, 188, 140,
    230,  139, 165,  230, 156, 137,  230,  160, 184, 230, 173,  166, 229, 153,
    168,  239, 188,  140, 229, 185,  182,  229, 133, 183, 229,  164, 135, 229,
    143,  145, 229,  176, 132, 229,  141,  171, 230, 152, 159,  227, 128, 129,
    232,  175, 149,  233, 170, 140,  229,  158, 139, 231, 169,  186, 233, 151,
    180,  231, 171,  153, 229, 146,  140,  230, 156, 136, 231,  144, 131, 229,
    143,  138, 230,  183, 177, 231,  169,  186, 230, 142, 162,  230, 181, 139,
    229,  153, 168,  231, 154, 132,  232,  131, 189, 229, 138,  155, 239, 188,
    155,  '2', '0',  '0', '3', 229,  185,  180, 239, 188, 140,  228, 184, 173,
    229,  155, 189,  230, 136, 144,  228,  184, 186, 228, 184,  150, 231, 149,
    140,  231, 172,  172, 228, 184,  137,  228, 184, 170, 232,  135, 170, 228,
    184,  187, 230,  136, 144, 229,  138,  159, 229, 143, 145,  229, 176, 132,
    232,  189, 189,  228, 186, 186,  232,  136, 170, 229, 164,  169, 229, 153,
    168,  231, 154,  132, 229, 155,  189,  229, 174, 182, 227,  128, 130, 228,
    184,  173, 229,  155, 189, 228,  186,  166, 230, 152, 175,  230, 189, 156,
    229,  156, 168,  232, 182, 133,  231,  186, 167, 229, 164,  167, 229, 155,
    189,  228, 185,  139, 228, 184,  128,  239, 188, 140, 232,  162, 171, 232,
    174,  164, 228,  184, 186, 230,  152,  175, 228, 184, 139,  228, 184, 128,
    228,  189, 141,  232, 182, 133,  231,  186, 167, 229, 164,  167, 229, 155,
    189,  231, 154,  132, 230, 156,  137,  229, 138, 155, 229,  128, 153, 233,
    128,  137, 228,  186, 186, 227,  128,  130, 13,  10,  13,   10,  228, 184,
    173,  229, 141,  142, 228, 186,  186,  230, 176, 145, 229,  133, 177, 229,
    146,  140, 229,  155, 189, 231,  154,  132, 230, 173, 163,  229, 188, 143,
    229,  155, 189,  229, 144, 141,  228,  186, 142, '1', '9',  '4', '9', 229,
    185,  180, 231,  148, 177, 228,  184,  173, 229, 156, 139,  228, 186, 186,
    230,  176, 145,  230, 148, 191,  230,  178, 187, 229, 141,  148, 229, 149,
    134,  230, 156,  131, 232, 173,  176,  231, 177, 140, 229,  130, 153, 230,
    156,  131, 232,  173, 176, 231,  162,  186, 229, 174, 154,  239, 188, 140,
    229,  189, 147,  229, 136, 157,  230,  155, 190, 229, 138,  160, 232, 168,
    187,  227, 128,  140, 231, 176,  161,  231, 168, 177, 239,  188, 154, 228,
    184,  173, 232,  143, 175, 230,  176,  145, 229, 156, 139,  227, 128, 141,
    239,  188, 140,  228, 189, 134,  229,  143, 184, 229, 190,  146, 231, 190,
    142,  229, 160,  130, 231, 173,  137,  230, 176, 145, 228,  184, 187, 229,
    133,  154, 230,  180, 190, 228,  186,  186, 229, 163, 171,  232, 174, 164,
    228,  184, 186,  230, 150, 176,  228,  184, 173, 229, 155,  189, 229, 186,
    148,  231, 161,  174, 231, 171,  139,  230, 150, 176, 229,  155, 189, 229,
    144,  141, 239,  188, 140, 228,  187,  165, 231, 164, 186,  228, 184, 164,
    230,  172, 161,  233, 157, 169,  229,  145, 189, 231, 154,  132, 230, 160,
    185,  230, 156,  172, 230, 132,  143,  228, 185, 137, 228,  184, 141, 229,
    144,  140, '[',  '1', '5', ']',  227,  128, 130, 229, 155,  160, 230, 173,
    164,  231, 155,  180, 232, 135,  179,  '9', 230, 156, 136,  '2', '7', 230,
    151,  165, 230,  148, 191, 229,  141,  148, 229, 133, 168,  233, 171, 148,
    230,  156, 131,  232, 173, 176,  232,  161, 168, 230, 177,  186, 233, 128,
    154,  233, 129,  142, 228, 184,  173,  229, 164, 174, 228,  186, 186, 230,
    176,  145, 230,  148, 191, 229,  186,  156, 231, 181, 132,  231, 185, 148,
    230,  179, 149,  230, 153, 130,  239,  188, 140, 230, 173,  163, 229, 188,
    143,  232, 173,  176, 230, 177,  186,  229, 142, 187, 233,  153, 164, 230,
    173,  164, 229,  138, 160, 232,  168,  187, '[', '1', '6',  ']', 227, 128,
    130,  13,  10,   13,  10,  229,  156,  168, 229, 133, 168,  233, 131, 168,
    229,  156, 139,  233, 154, 155,  229,  160, 180, 229, 144,  136, 239, 188,
    140,  228, 184,  173, 232, 143,  175,  228, 186, 186, 230,  176, 145, 229,
    133,  177, 229,  146, 140, 229,  156,  139, 228, 184, 128,  232, 136, 172,
    231,  176, 161,  231, 168, 177,  231,  130, 186, 228, 184,  173, 229, 156,
    139,  239, 188,  140, 230, 156,  137,  230, 151, 182, 229,  128, 153, 228,
    185,  159, 229,  155, 160, 229,  133,  182, 230, 137, 128,  229, 164, 132,
    229,  156, 176,  231, 144, 134,  228,  189, 141, 231, 189,  174, 232, 128,
    140,  232, 162,  171, 231, 167,  176,  228, 184, 186, 228,  184, 173, 229,
    155,  189, 229,  164, 167, 233,  153,  134, 227, 128, 130,  229, 156, 168,
    228,  184, 173,  229, 156, 139,  229,  156, 139, 229, 133,  167, 239, 188,
    140,  231, 149,  182, '1', '9',  '4',  '9', 229, 185, 180,  229, 137, 141,
    231,  154, 132,  228, 184, 173,  232,  143, 175, 230, 176,  145, 229, 156,
    139,  232, 136,  135, '1', '9',  '4',  '9', 229, 185, 180,  229, 190, 140,
    231,  154, 132,  228, 184, 173,  232,  143, 175, 228, 186,  186, 230, 176,
    145,  229, 133,  177, 229, 146,  140,  229, 156, 139, 229,  129, 154, 229,
    176,  141, 230,  175, 148, 230,  136,  150, 230, 156, 137,  230, 173, 164,
    230,  182, 181,  230, 140, 135,  230,  153, 130, 239, 188,  140, 229, 137,
    141,  232, 128,  133, 229, 184,  184,  232, 162, 171, 231,  168, 177, 231,
    130,  186, 232,  136, 138, 228,  184,  173, 229, 156, 139,  239, 188, 136,
    228,  186, 166,  231, 168, 177,  232,  136, 138, 231, 164,  190, 230, 156,
    131,  239, 188,  137, 239, 188,  140,  232, 128, 140, 229,  190, 140, 232,
    128,  133, 229,  137, 135, 229,  184,  184, 232, 162, 171,  231, 168, 177,
    231,  130, 186,  230, 150, 176,  228,  184, 173, 229, 156,  139, 227, 128,
    130,  231, 155,  174, 229, 137,  141,  239, 188, 140, 228,  184, 173, 232,
    143,  175, 228,  186, 186, 230,  176,  145, 229, 133, 177,  229, 146, 140,
    229,  156, 139,  232, 170, 141,  231,  130, 186, 228, 184,  173, 232, 143,
    175,  230, 176,  145, 229, 156,  139,  229, 183, 178, 232,  162, 171, 229,
    133,  182, 229,  143, 150, 228,  187,  163, 239, 188, 140,  228, 184, 173,
    232,  143, 175,  230, 176, 145,  229,  156, 139, 230, 148,  191, 229, 186,
    156,  229, 137,  135, 228, 184,  141,  230, 137, 191, 232,  170, 141, 228,
    184,  173, 232,  143, 175, 228,  186,  186, 230, 176, 145,  229, 133, 177,
    229,  146, 140,  229, 156, 139,  231,  154, 132, 230, 173,  163, 231, 181,
    177,  230, 128,  167, 239, 188,  140,  231, 149, 182, 229,  156, 168, 228,
    184,  173, 229,  156, 139, 229,  164,  167, 233, 153, 184,  231, 154, 132,
    228,  184, 173,  232, 143, 175,  228,  186, 186, 230, 176,  145, 229, 133,
    177,  229, 146,  140, 229, 156,  139,  230, 148, 191, 229,  186, 156, 232,
    136,  135, 229,  156, 168, 229,  143,  176, 231, 129, 163,  231, 154, 132,
    228,  184, 173,  232, 143, 175,  230,  176, 145, 229, 156,  139, 230, 148,
    191,  229, 186,  156, 229, 129,  154,  229, 176, 141, 230,  175, 148, 230,
    136,  150, 230,  156, 137, 230,  173,  164, 230, 182, 181,  230, 140, 135,
    230,  153, 130,  239, 188, 140,  229,  137, 141, 232, 128,  133, 229, 184,
    184,  232, 162,  171, 229, 190,  140,  232, 128, 133, 231,  168, 177, 231,
    130,  186, 229,  140, 151, 228,  186,  172, 231, 149, 182,  229, 177, 128,
    227,  128, 129,  229, 164, 167,  233,  153, 184, 231, 149,  182, 229, 177,
    128,  227, 128,  129, 228, 184,  173,  229, 133, 177, 231,  149, 182, 229,
    177,  128, 227,  128, 129, 228,  184,  173, 229, 156, 139,  229, 164, 167,
    233,  153, 184,  230, 136, 150,  229,  164, 167, 233, 153,  184, '[', '1',
    '7',  ']', 239,  188, 140, 229,  190,  140, 232, 128, 133,  229, 184, 184,
    232,  162, 171,  229, 137, 141,  232,  128, 133, 231, 168,  177, 231, 130,
    186,  229, 143,  176, 231, 129,  163,  231, 149, 182, 229,  177, 128, 227,
    128,  129, 229,  143, 176, 229,  140,  151, 231, 149, 182,  229, 177, 128,
    230,  136, 150,  229, 143, 176,  231,  129, 163, '[', '1',  '8', ']', 227,
    128,  130, 232,  136, 135, 230,  184,  175, 230, 190, 179,  229, 156, 176,
    229,  141, 128,  228, 184, 166,  231,  148, 168, 230, 153,  130, 229, 137,
    135,  231, 168,  177, 231, 130,  186,  228, 184, 173, 229,  156, 139, 229,
    133,  167, 229,  156, 176, 227,  128,  129, 229, 133, 167,  229, 156, 176,
    '[',  '1', '9',  ']', 227, 128,  130,  13,  10,  13,  10,   231, 149, 182,
    228,  184, 173,  229, 156, 139,  229,  164, 167, 233, 153,  184, 231, 154,
    132,  228, 184,  173, 232, 143,  175,  228, 186, 186, 230,  176, 145, 229,
    133,  177, 229,  146, 140, 229,  156,  139, 230, 148, 191,  229, 186, 156,
    232,  136, 135,  229, 156, 168,  229,  143, 176, 231, 129,  163, 231, 154,
    132,  228, 184,  173, 232, 143,  175,  230, 176, 145, 229,  156, 139, 230,
    148,  191, 229,  186, 156, 229,  129,  154, 229, 176, 141,  230, 175, 148,
    230,  136, 150,  229, 141, 128,  233,  154, 148, 228, 187,  139, 231, 180,
    185,  230, 153,  130, 239, 188,  140,  233, 128, 154, 229,  184, 184, 230,
    142,  161, 231,  148, 168, 229,  156,  176, 231, 144, 134,  229, 144, 141,
    232,  169, 158,  227, 128, 140,  228,  184, 173, 229, 156,  139, 229, 164,
    167,  233, 153,  184, 227, 128,  141,  239, 188, 136, 'C',  'h', 'i', 'n',
    'a',  ' ', 'M',  'a', 'i', 'n',  'l',  'a', 'n', 'd', 239,  188, 137, 230,
    136,  150, 228,  184, 173, 229,  155,  189, 239, 188, 136,  'C', 'h', 'i',
    'n',  'a', 239,  188, 137, 229,  129,  154, 231, 130, 186,  228, 184, 173,
    232,  143, 175,  228, 186, 186,  230,  176, 145, 229, 133,  177, 229, 146,
    140,  229, 156,  139, 231, 154,  132,  231, 176, 161, 231,  168, 177, 239,
    188,  140, 229,  176, 141, 230,  150,  188, 228, 184, 173,  232, 143, 175,
    230,  176, 145,  229, 156, 139,  229,  137, 135, 231, 176,  161, 231, 168,
    177,  231, 130,  186, 228, 184,  173,  232, 143, 175, 229,  143, 176, 229,
    140,  151, 239,  188, 136, 'C',  'h',  'i', 'n', 'e', 's',  'e', ' ', 'T',
    'a',  'i', 'p',  'e', 'i', 239,  188,  137, 230, 136, 150,  229, 143, 176,
    231,  129, 163,  239, 188, 136,  'T',  'a', 'i', 'w', 'a',  'n', 239, 188,
    137,  227, 128,  130, 232, 128,  140,  229, 143, 176, 230,  185, 190, 231,
    154,  132, 229,  170, 146, 228,  189,  147, 229, 137, 135,  229, 184, 184,
    228,  189, 191,  231, 148, 168,  227,  128, 140, 228, 184,  173, 229, 133,
    177,  227, 128,  141, 227, 128,  129,  227, 128, 140, 229,  164, 167, 233,
    153,  184, 229,  156, 176, 229,  141,  128, 227, 128, 141,  227, 128, 129,
    227,  128, 140,  229, 164, 167,  233,  153, 184, 227, 128,  141, 230, 136,
    150,  227, 128,  140, 228, 184,  173,  229, 155, 189, 227,  128, 141, 230,
    157,  165, 228,  189, 156, 231,  130,  186, 228, 184, 173,  232, 143, 175,
    228,  186, 186,  230, 176, 145,  229,  133, 177, 229, 146,  140, 229, 156,
    139,  231, 154,  132, 231, 176,  161,  231, 168, 177, 227,  128, 130, 233,
    166,  153, 230,  184, 175, 233,  131,  168, 229, 136, 134,  229, 170, 146,
    233,  171, 148,  228, 185, 159,  230,  156, 137, 228, 189,  191, 231, 148,
    168,  227, 128,  140, 228, 184,  173,  229, 156, 139, 227,  128, 141, 229,
    146,  140, 227,  128, 140, 228,  184,  173, 229, 133, 177,  227, 128, 141,
    228,  190, 134,  230, 140, 135,  228,  187, 163, 228, 184,  173, 229, 156,
    139,  229, 164,  167, 233, 153,  184,  227, 128, 130, 13,   10,  13,  10,
    '1',  '9', '4',  '9', 229, 185,  180,  239, 188, 140, 230,  173, 183, 230,
    153,  130, 228,  184, 137, 229,  185,  180, 231, 154, 132,  229, 156, 139,
    229,  133, 177,  229, 133, 167,  230,  136, 176, 228, 184,  187, 232, 166,
    129,  230, 136,  176, 229, 189,  185,  231, 181, 144, 230,  157, 159, 239,
    188,  140, 228,  184, 173, 229,  156,  139, 229, 133, 177,  231, 148, 162,
    233,  187, 168,  230, 137, 128,  233,  160, 152, 229, 176,  142, 231, 154,
    132,  228, 184,  173, 229, 156,  139,  228, 186, 186, 230,  176, 145, 232,
    167,  163, 230,  148, 190, 232,  187,  141, 230, 136, 176,  229, 139, 157,
    228,  186, 134,  228, 184, 173,  229,  156, 139, 229, 156,  139, 230, 176,
    145,  233, 187,  168, 230, 137,  128,  233, 160, 152, 229,  176, 142, 231,
    154,  132, 228,  184, 173, 232,  143,  175, 230, 176, 145,  229, 156, 139,
    229,  155, 189,  232, 187, 141,  '[',  230, 179, 168, ' ',  '6', ']', 239,
    188,  140, 228,  184, 166, 229,  183,  178, 233, 128, 144,  230, 188, 184,
    230,  142, 167,  229, 136, 182,  228,  186, 134, 228, 184,  173, 229, 156,
    139,  229, 164,  167, 233, 153,  184,  229, 164, 167, 233,  131, 168, 229,
    136,  134, 231,  156, 129, 228,  187,  189, 229, 146, 140,  229, 156, 176,
    229,  140, 186,  227, 128, 130,  13,   10,  13,  10,  229,  144, 140, 229,
    185,  180, '9',  230, 156, 136,  '2',  '1', 230, 151, 165,  232, 135, 179,
    '9',  230, 156,  136, '3', '0',  230,  151, 165, 239, 188,  140, 231, 182,
    147,  233, 129,  142, 230, 149,  184,  230, 156, 136, 231,  154, 132, 231,
    177,  140, 229,  130, 153, 239,  188,  140, 228, 184, 173,  229, 156, 139,
    228,  186, 186,  230, 176, 145,  230,  148, 191, 230, 178,  187, 229, 141,
    148,  229, 149,  134, 230, 156,  131,  232, 173, 176, 231,  172, 172, 228,
    184,  128, 229,  177, 134, 229,  133,  168, 233, 171, 148,  230, 156, 131,
    232,  173, 176,  229, 156, 168,  229,  140, 151, 229, 185,  179, 229, 143,
    172,  233, 150,  139, 227, 128,  130,  '9', 230, 156, 136,  '2', '1', 230,
    151,  165, 239,  188, 140, 228,  184,  173, 229, 156, 139,  228, 186, 186,
    230,  176, 145,  230, 148, 191,  230,  178, 187, 229, 141,  148, 229, 149,
    134,  230, 156,  131, 232, 173,  176,  231, 172, 172, 228,  184, 128, 229,
    177,  134, 229,  133, 168, 233,  171,  148, 230, 156, 131,  232, 173, 176,
    230,  173, 163,  229, 188, 143,  229,  174, 163, 229, 184,  131, 230, 136,
    144,  231, 171,  139, 228, 184,  173,  229, 141, 142, 228,  186, 186, 230,
    176,  145, 229,  133, 177, 229,  146,  140, 229, 155, 189,  '[', '2', '0',
    ']',  227, 128,  130, 228, 188,  154,  232, 174, 174, 233,  128, 154, 233,
    129,  142, 228,  186, 134, 227,  128,  138, 228, 184, 173,  229, 156, 139,
    228,  186, 186,  230, 176, 145,  230,  148, 191, 230, 178,  187, 229, 141,
    148,  229, 149,  134, 230, 156,  131,  232, 173, 176, 231,  181, 132, 231,
    185,  148, 230,  179, 149, 227,  128,  139, 227, 128, 129,  227, 128, 138,
    228,  184, 173,  232, 143, 175,  228,  186, 186, 230, 176,  145, 229, 133,
    177,  229, 146,  140, 229, 156,  139,  228, 184, 173, 229,  164, 174, 228,
    186,  186, 230,  176, 145, 230,  148,  191, 229, 186, 156,  231, 181, 132,
    231,  185, 148,  230, 179, 149,  227,  128, 139, 229, 146,  140, 229, 133,
    183,  230, 156,  137, 232, 135,  168,  230, 153, 130, 230,  134, 178, 230,
    179,  149, 230,  128, 167, 232,  179,  170, 231, 154, 132,  227, 128, 138,
    228,  184, 173,  229, 156, 139,  228,  186, 186, 230, 176,  145, 230, 148,
    191,  230, 178,  187, 229, 141,  148,  229, 149, 134, 230,  156, 131, 232,
    173,  176, 229,  133, 177, 229,  144,  140, 231, 182, 177,  233, 160, 152,
    227,  128, 139,  239, 188, 140,  230,  177, 186, 229, 174,  154, 228, 187,
    165,  229, 140,  151, 229, 185,  179,  231, 130, 186, 233,  166, 150, 233,
    131,  189, 228,  184, 166, 230,  148,  185, 229, 144, 141,  231, 136, 178,
    229,  140, 151,  228, 186, 172,  227,  128, 129, 228, 187,  165, 229, 133,
    172,  229, 133,  131, 231, 180,  128,  229, 185, 180, 227,  128, 129, 228,
    187,  165, 231,  190, 169, 229,  139,  135, 232, 187, 141,  233, 128, 178,
    232,  161, 140,  230, 155, 178,  231,  130, 186, 228, 187,  163, 229, 156,
    139,  230, 173,  140, 227, 128,  129,  228, 187, 165, 228,  186, 148, 230,
    152,  159, 231,  180, 133, 230,  151,  151, 231, 130, 186,  229, 156, 139,
    230,  151, 151,  239, 188, 140,  233,  128, 154, 233, 129,  142, 228, 186,
    134,  231, 148,  177, '1', '8',  '0',  228, 186, 186, 231,  181, 132, 230,
    136,  144, 231,  154, 132, 228,  184,  173, 229, 156, 139,  228, 186, 186,
    230,  176, 145,  230, 148, 191,  230,  178, 187, 229, 141,  148, 229, 149,
    134,  230, 156,  131, 232, 173,  176,  231, 172, 172, 228,  184, 128, 229,
    177,  134, 229,  133, 168, 229,  156,  139, 229, 167, 148,  229, 147, 161,
    230,  156, 131,  229, 144, 141,  229,  150, 174, 239, 188,  140, 228, 184,
    166,  233, 129,  184, 232, 136,  137,  230, 175, 155, 230,  190, 164, 230,
    157,  177, 231,  130, 186, 228,  184,  173, 229, 164, 174,  228, 186, 186,
    230,  176, 145,  230, 148, 191,  229,  186, 156, 228, 184,  187, 229, 184,
    173,  227, 128,  129, 230, 156,  177,  229, 190, 183, 227,  128, 129, 229,
    136,  152, 229,  176, 145, 229,  165,  135, 227, 128, 129,  229, 174, 139,
    229,  186, 134,  233, 190, 132,  227,  128, 129, 230, 157,  142, 230, 181,
    142,  230, 183,  177, 227, 128,  129,  229, 188, 160, 230,  190, 156, 227,
    128,  129, 233,  171, 152, 229,  178,  151, 231, 130, 186,  229, 137, 175,
    228,  184, 187,  229, 184, 173,  227,  128, 129, 229, 143,  166, 229, 164,
    150,  '5', '6',  228, 189, 141,  231,  130, 186, 228, 184,  173, 229, 164,
    174,  228, 186,  186, 230, 176,  145,  230, 148, 191, 229,  186, 156, 229,
    167,  148, 229,  147, 161, 227,  128,  130, '1', '0', 230,  156, 136, '1',
    230,  151, 165,  229, 188, 128,  229,  155, 189, 229, 164,  167, 229, 133,
    184,  229, 156,  168, 229, 140,  151,  228, 186, 172, 228,  184, 190, 232,
    161,  140, 239,  188, 140, 230,  175,  155, 230, 190, 164,  230, 157, 177,
    229,  156, 168,  229, 164, 169,  229,  174, 137, 233, 151,  168, 229, 159,
    142,  230, 165,  188, 229, 174,  163,  229, 145, 138, 228,  184, 173, 229,
    141,  142, 228,  186, 186, 230,  176,  145, 229, 133, 177,  229, 146, 140,
    229,  155, 189,  228, 184, 173,  229,  164, 174, 228, 186,  186, 230, 176,
    145,  230, 148,  191, 229, 186,  156,  230, 136, 144, 231,  171, 139, 239,
    188,  155, '1',  '2', 230, 156,  136,  '7', 230, 151, 165,  239, 188, 140,
    228,  184, 173,  232, 143, 175,  230,  176, 145, 229, 156,  139, 230, 148,
    191,  229, 186,  156, 230, 173,  163,  229, 188, 143, 231,  148, 177, 229,
    155,  155, 229,  183, 157, 231,  156,  129, 230, 136, 144,  233, 131, 189,
    229,  184, 130,  233, 129, 183,  229,  190, 128, 229, 143,  176, 230, 185,
    190,  231, 156,  129, 229, 143,  176,  229, 140, 151, 229,  184, 130, 239,
    188,  140, 228,  184, 166, 231,  185,  188, 231, 186, 140,  231, 181, 177,
    230,  178, 187,  229, 143, 176,  231,  129, 163, 230, 156,  172, 229, 179,
    182,  229, 143,  138, 230, 190,  142,  230, 185, 150, 227,  128, 129, 233,
    131,  168, 229,  136, 134, 231,  166,  143, 229, 187, 186,  233, 155, 162,
    229,  179, 182,  227, 128, 129,  228,  184, 156, 230, 178,  153, 231, 190,
    164,  229, 178,  155, 227, 128,  129,  229, 164, 170, 229,  185, 179, 229,
    178,  155, 231,  173, 137, 232,  135,  179, 228, 187, 138,  227, 128, 130,
    232,  135, 179,  230, 173, 164,  239,  188, 140, 228, 184,  173, 229, 156,
    139,  230, 173,  183, 229, 143,  178,  228, 184, 138, 230,  150, 188, 230,
    181,  183, 229,  179, 189, 229,  133,  169, 229, 178, 184,  229, 136, 134,
    230,  178, 187,  231, 154, 132,  230,  148, 191, 230, 178,  187, 230, 160,
    188,  229, 177,  128, 230, 173,  163,  229, 188, 143, 229,  189, 162, 230,
    136,  144, 227,  128, 130, 13,   10,   13,  10,  'H', 'i',  'n', 'd', 'i',
    ':',  13,  10,   13,  10,  224,  164,  173, 224, 164, 190,  224, 164, 176,
    224,  164, 164,  ',', ' ', 224,  164,  170, 224, 165, 140,  224, 164, 176,
    224,  164, 190,  224, 164, 163,  224,  164, 191, 224, 164,  149, ' ', 224,
    164,  156, 224,  164, 174, 224,  165,  141, 224, 164, 172,  224, 165, 130,
    224,  164, 166,  224, 165, 141,  224,  164, 181, 224, 165,  128, 224, 164,
    170,  ',', ' ',  224, 164, 134,  224,  164, 167, 224, 165,  129, 224, 164,
    168,  224, 164,  191, 224, 164,  149,  ' ', 224, 164, 166,  224, 164, 149,
    224,  165, 141,  224, 164, 183,  224,  164, 191, 224, 164,  163, ' ', 224,
    164,  143, 224,  164, 182, 224,  164,  191, 224, 164, 175,  224, 164, 190,
    ' ',  224, 164,  174, 224, 165,  135,  224, 164, 130, ' ',  224, 164, 184,
    224,  165, 141,  224, 164, 165,  224,  164, 191, 224, 164,  164, ' ', 224,
    164,  173, 224,  164, 190, 224,  164,  176, 224, 164, 164,  224, 165, 128,
    224,  164, 175,  ' ', 224, 164,  137,  224, 164, 170, 224,  164, 174, 224,
    164,  185, 224,  164, 190, 224,  164,  166, 224, 165, 141,  224, 164, 181,
    224,  165, 128,  224, 164, 170,  ' ',  224, 164, 149, 224,  164, 190, ' ',
    224,  164, 184,  224, 164, 172,  224,  164, 184, 224, 165,  135, ' ', 224,
    164,  172, 224,  164, 161, 224,  164,  188, 224, 164, 190,  ' ', 224, 164,
    166,  224, 165,  135, 224, 164,  182,  ' ', 224, 164, 185,  224, 165, 136,
    224,  165, 164,  ' ', 224, 164,  173,  224, 164, 190, 224,  164, 176, 224,
    164,  164, ' ',  224, 164, 149,  224,  164, 190, ' ', 224,  164, 173, 224,
    165,  140, 224,  164, 151, 224,  165,  139, 224, 164, 178,  224, 164, 191,
    224,  164, 149,  ' ', 224, 164,  171,  224, 165, 136, 224,  164, 178, 224,
    164,  190, 224,  164, 181, ' ',  224,  165, 174, 224, 165,  166, ' ', 224,
    165,  170, '\'', ' ', 224, 164,  184,  224, 165, 135, ' ',  224, 165, 169,
    224,  165, 173,  224, 165, 166,  ' ',  224, 165, 172, '\'', ' ', 224, 164,
    137,  224, 164,  164, 224, 165,  141,  224, 164, 164, 224,  164, 176, 224,
    165,  128, ' ',  224, 164, 133,  224,  164, 149, 224, 165,  141, 224, 164,
    183,  224, 164,  190, 224, 164,  130,  224, 164, 182, ' ',  224, 164, 164,
    224,  164, 149,  ' ', 224, 164,  164,  224, 164, 165, 224,  164, 190, ' ',
    224,  165, 172,  224, 165, 174,  224,  165, 166, ' ', 224,  165, 173, '\'',
    ' ',  224, 164,  184, 224, 165,  135,  ' ', 224, 165, 175,  224, 165, 173,
    224,  165, 166,  ' ', 224, 165,  168,  224, 165, 171, '\'', 224, 164, 170,
    224,  165, 130,  224, 164, 176,  224,  165, 141, 224, 164,  181, 224, 165,
    128,  ' ', 224,  164, 166, 224,  165,  135, 224, 164, 182,  224, 164, 190,
    224,  164, 168,  224, 165, 141,  224,  164, 164, 224, 164,  176, ' ', 224,
    164,  164, 224,  164, 149, ' ',  224,  164, 185, 224, 165,  136, 224, 165,
    164,  ' ', 224,  164, 173, 224,  164,  190, 224, 164, 176,  224, 164, 164,
    ' ',  224, 164,  149, 224, 164,  190,  ' ', 224, 164, 181,  224, 164, 191,
    224,  164, 184,  224, 165, 141,  224,  164, 164, 224, 164,  190, 224, 164,
    176,  ' ', 224,  164, 137, 224,  164,  164, 224, 165, 141,  224, 164, 164,
    224,  164, 176,  ' ', 224, 164,  184,  224, 165, 135, ' ',  224, 164, 166,
    224,  164, 149,  224, 165, 141,  224,  164, 183, 224, 164,  191, 224, 164,
    163,  ' ', 224,  164, 164, 224,  164,  149, ' ', 224, 164,  149, 224, 164,
    191,  '.', ' ',  224, 164, 174,  224,  165, 128, '.', ' ',  224, 164, 148,
    224,  164, 176,  ' ', 224, 164,  170,  224, 165, 130, 224,  164, 176, 224,
    165,  141, 224,  164, 181, ' ',  224,  164, 184, 224, 165,  135, ' ', 224,
    164,  170, 224,  164, 182, 224,  165,  141, 224, 164, 154,  224, 164, 191,
    224,  164, 174,  ' ', 224, 164,  164,  224, 164, 149, ' ',  224, 165, 168,
    ',',  224, 165,  175, 224, 165,  169,  224, 165, 169, ' ',  224, 164, 149,
    224,  164, 191,  '.', ' ', 224,  164,  174, 224, 165, 128,  '.', ' ', 224,
    164,  185, 224,  165, 136, 224,  165,  164, ' ', 224, 164,  173, 224, 164,
    190,  224, 164,  176, 224, 164,  164,  ' ', 224, 164, 149,  224, 165, 128,
    ' ',  224, 164,  184, 224, 164,  174,  224, 165, 129, 224,  164, 166, 224,
    165,  141, 224,  164, 176, ' ',  224,  164, 164, 224, 164,  159, ' ', 224,
    164,  176, 224,  165, 135, 224,  164,  150, 224, 164, 190,  ' ', 224, 165,
    173,  224, 165,  171, 224, 165,  167,  224, 165, 172, '.',  224, 165, 172,
    ' ',  224, 164,  149, 224, 164,  191,  224, 164, 178, 224,  165, 139, 224,
    164,  174, 224,  165, 128, 224,  164,  159, 224, 164, 176,  ' ', 224, 164,
    178,  224, 164,  174, 224, 165,  141,  224, 164, 172, 224,  165, 128, ' ',
    224,  164, 185,  224, 165, 136,  224,  165, 164, ' ', 224,  164, 173, 224,
    164,  190, 224,  164, 176, 224,  164,  164, ',', ' ', 224,  164, 173, 224,
    165,  140, 224,  164, 151, 224,  165,  139, 224, 164, 178,  224, 164, 191,
    224,  164, 149,  ' ', 224, 164,  166,  224, 165, 131, 224,  164, 183, 224,
    165,  141, 224,  164, 159, 224,  164,  191, ' ', 224, 164,  184, 224, 165,
    135,  ' ', 224,  164, 181, 224,  164,  191, 224, 164, 182,  224, 165, 141,
    224,  164, 181,  ' ', 224, 164,  174,  224, 165, 135, 224,  164, 130, ' ',
    224,  164, 184,  224, 164, 190,  224,  164, 164, 224, 164,  181, 224, 164,
    190,  224, 164,  129, ' ', 224,  164,  184, 224, 164, 172,  224, 164, 184,
    224,  165, 135,  ' ', 224, 164,  172,  224, 164, 161, 224,  164, 188, 224,
    164,  190, ' ',  224, 164, 148,  224,  164, 176, ' ', 224,  164, 156, 224,
    164,  168, 224,  164, 184, 224,  164,  129, 224, 164, 150,  224, 165, 141,
    224,  164, 175,  224, 164, 190,  ' ',  224, 164, 149, 224,  165, 135, ' ',
    224,  164, 166,  224, 165, 131,  224,  164, 183, 224, 165,  141, 224, 164,
    159,  224, 164,  191, 224, 164,  149,  224, 165, 139, 224,  164, 163, ' ',
    224,  164, 184,  224, 165, 135,  ' ',  224, 164, 166, 224,  165, 130, 224,
    164,  184, 224,  164, 176, 224,  164,  190, ' ', 224, 164,  184, 224, 164,
    172,  ' ', 224,  164, 184, 224,  165,  135, ' ', 224, 164,  172, 224, 164,
    161,  224, 164,  188, 224, 164,  190,  ' ', 224, 164, 166,  224, 165, 135,
    224,  164, 182,  ' ', 224, 164,  185,  224, 165, 136, 224,  165, 164, ' ',
    224,  164, 173,  224, 164, 190,  224,  164, 176, 224, 164,  164, ' ', 224,
    164,  149, 224,  165, 135, ' ',  224,  164, 170, 224, 164,  182, 224, 165,
    141,  224, 164,  154, 224, 164,  191,  224, 164, 174, ' ',  224, 164, 174,
    224,  165, 135,  224, 164, 130,  ' ',  224, 164, 170, 224,  164, 190, 224,
    164,  149, 224,  164, 191, 224,  164,  184, 224, 165, 141,  224, 164, 164,
    224,  164, 190,  224, 164, 168,  ',',  ' ', 224, 164, 137,  224, 164, 164,
    224,  165, 141,  224, 164, 164,  224,  164, 176, '-', 224,  164, 170, 224,
    165,  130, 224,  164, 176, 224,  165,  141, 224, 164, 181,  ' ', 224, 164,
    174,  224, 165,  135, 224, 164,  130,  ' ', 224, 164, 154,  224, 165, 128,
    224,  164, 168,  ',', ' ', 224,  164,  168, 224, 165, 135,  224, 164, 170,
    224,  164, 190,  224, 164, 178,  ',',  ' ', 224, 164, 148,  224, 164, 176,
    ' ',  224, 164,  173, 224, 165,  130,  224, 164, 159, 224,  164, 190, 224,
    164,  168, ' ',  224, 164, 148,  224,  164, 176, ' ', 224,  164, 170, 224,
    165,  130, 224,  164, 176, 224,  165,  141, 224, 164, 181,  ' ', 224, 164,
    174,  224, 165,  135, 224, 164,  130,  ' ', 224, 164, 172,  224, 164, 190,
    224,  164, 130,  224, 164, 151,  224,  165, 141, 224, 164,  178, 224, 164,
    190,  224, 164,  166, 224, 165,  135,  224, 164, 182, ' ',  224, 164, 148,
    224,  164, 176,  ' ', 224, 164,  174,  224, 165, 141, 224,  164, 175, 224,
    164,  190, 224,  164, 168, 224,  165,  141, 224, 164, 174,  224, 164, 190,
    224,  164, 176,  ' ', 224, 164,  166,  224, 165, 135, 224,  164, 182, ' ',
    224,  164, 184,  224, 165, 141,  224,  164, 165, 224, 164,  191, 224, 164,
    164,  ' ', 224,  164, 185, 224,  165,  136, 224, 164, 130,  224, 165, 164,
    ' ',  224, 164,  185, 224, 164,  191,  224, 164, 168, 224,  165, 141, 224,
    164,  166, ' ',  224, 164, 174,  224,  164, 185, 224, 164,  190, 224, 164,
    184,  224, 164,  190, 224, 164,  151,  224, 164, 176, ' ',  224, 164, 174,
    224,  165, 135,  224, 164, 130,  ' ',  224, 164, 135, 224,  164, 184, 224,
    164,  149, 224,  165, 135, ' ',  224,  164, 166, 224, 164,  149, 224, 165,
    141,  224, 164,  183, 224, 164,  191,  224, 164, 163, ' ',  224, 164, 170,
    224,  164, 182,  224, 165, 141,  224,  164, 154, 224, 164,  191, 224, 164,
    174,  ' ', 224,  164, 174, 224,  165,  135, 224, 164, 130,  ' ', 224, 164,
    174,  224, 164,  190, 224, 164,  178,  224, 164, 166, 224,  165, 128, 224,
    164,  181, ',',  ' ', 224, 164,  166,  224, 164, 149, 224,  165, 141, 224,
    164,  183, 224,  164, 191, 224,  164,  163, ' ', 224, 164,  174, 224, 165,
    135,  224, 164,  130, ' ', 224,  164,  182, 224, 165, 141,  224, 164, 176,
    224,  165, 128,  224, 164, 178,  224,  164, 130, 224, 164,  149, 224, 164,
    190,  ' ', 224,  164, 148, 224,  164,  176, ' ', 224, 164,  166, 224, 164,
    149,  224, 165,  141, 224, 164,  183,  224, 164, 191, 224,  164, 163, '-',
    224,  164, 170,  224, 165, 130,  224,  164, 176, 224, 165,  141, 224, 164,
    181,  ' ', 224,  164, 174, 224,  165,  135, 224, 164, 130,  ' ', 224, 164,
    135,  224, 164,  130, 224, 164,  161,  224, 165, 139, 224,  164, 168, 224,
    165,  135, 224,  164, 182, 224,  164,  191, 224, 164, 175,  224, 164, 190,
    ' ',  224, 164,  185, 224, 165,  136,  224, 164, 130, 224,  165, 164, ' ',
    224,  164, 137,  224, 164, 164,  224,  165, 141, 224, 164,  164, 224, 164,
    176,  '-', 224,  164, 170, 224,  164,  182, 224, 165, 141,  224, 164, 154,
    224,  164, 191,  224, 164, 174,  ' ',  224, 164, 174, 224,  165, 135, 224,
    164,  130, ' ',  224, 164, 133,  224,  164, 171, 224, 164,  188, 224, 164,
    151,  224, 164,  190, 224, 164,  168,  224, 164, 191, 224,  164, 184, 224,
    165,  141, 224,  164, 164, 224,  164,  190, 224, 164, 168,  ' ', 224, 164,
    149,  224, 165,  135, ' ', 224,  164,  184, 224, 164, 190,  224, 164, 165,
    ' ',  224, 164,  173, 224, 164,  190,  224, 164, 176, 224,  164, 164, ' ',
    224,  164, 149,  224, 165, 128,  ' ',  224, 164, 184, 224,  165, 128, 224,
    164,  174, 224,  164, 190, ' ',  224,  164, 185, 224, 165,  136, 224, 165,
    164,  ' ', 224,  164, 135, 224,  164,  184, 224, 164, 149,  224, 165, 135,
    ' ',  224, 164,  137, 224, 164,  164,  224, 165, 141, 224,  164, 164, 224,
    164,  176, ' ',  224, 164, 174,  224,  165, 135, 224, 164,  130, ' ', 224,
    164,  185, 224,  164, 191, 224,  164,  174, 224, 164, 190,  224, 164, 178,
    224,  164, 175,  ' ', 224, 164,  170,  224, 164, 176, 224,  165, 141, 224,
    164,  181, 224,  164, 164, ' ',  224,  164, 185, 224, 165,  136, ' ', 224,
    164,  148, 224,  164, 176, ' ',  224,  164, 166, 224, 164,  149, 224, 165,
    141,  224, 164,  183, 224, 164,  191,  224, 164, 163, ' ',  224, 164, 174,
    224,  165, 135,  224, 164, 130,  ' ',  224, 164, 185, 224,  164, 191, 224,
    164,  168, 224,  165, 141, 224,  164,  166, ' ', 224, 164,  174, 224, 164,
    185,  224, 164,  190, 224, 164,  184,  224, 164, 190, 224,  164, 151, 224,
    164,  176, ' ',  224, 164, 185,  224,  165, 136, 224, 165,  164, ' ', 224,
    164,  170, 224,  165, 130, 224,  164,  176, 224, 165, 141,  224, 164, 181,
    ' ',  224, 164,  174, 224, 165,  135,  224, 164, 130, ' ',  224, 164, 172,
    224,  164, 130,  224, 164, 151,  224,  164, 190, 224, 164,  178, ' ', 224,
    164,  149, 224,  165, 128, ' ',  224,  164, 150, 224, 164,  190, 224, 164,
    161,  224, 164,  188, 224, 165,  128,  ' ', 224, 164, 185,  224, 165, 136,
    ' ',  224, 164,  164, 224, 164,  165,  224, 164, 190, ' ',  224, 164, 170,
    224,  164, 182,  224, 165, 141,  224,  164, 154, 224, 164,  191, 224, 164,
    174,  ' ', 224,  164, 174, 224,  165,  135, 224, 164, 130,  ' ', 224, 164,
    133,  224, 164,  176, 224, 164,  172,  ' ', 224, 164, 184,  224, 164, 190,
    224,  164, 151,  224, 164, 176,  224,  164, 184, 224, 164,  174, 224, 165,
    129,  224, 164,  166, 224, 165,  141,  224, 164, 176, ' ',  224, 164, 185,
    224,  165, 136,  224, 164, 130,  ' ',  224, 165, 164, ' ',  224, 164, 173,
    224,  164, 190,  224, 164, 176,  224,  164, 164, ' ', 224,  164, 174, 224,
    165,  135, 224,  164, 130, ' ',  224,  164, 149, 224, 164,  136, ' ', 224,
    164,  172, 224,  164, 161, 224,  164,  188, 224, 165, 128,  ' ', 224, 164,
    168,  224, 164,  166, 224, 164,  191,  224, 164, 175, 224,  164, 190, 224,
    164,  129, ' ',  224, 164, 185,  224,  165, 136, 224, 164,  130, ' ', 224,
    165,  164, ' ',  224, 164, 151,  224,  164, 130, 224, 164,  151, 224, 164,
    190,  ' ', 224,  164, 168, 224,  164,  166, 224, 165, 128,  ' ', 224, 164,
    173,  224, 164,  190, 224, 164,  176,  224, 164, 164, 224,  165, 128, 224,
    164,  175, ' ',  224, 164, 184,  224,  164, 130, 224, 164,  184, 224, 165,
    141,  224, 164,  149, 224, 165,  131,  224, 164, 164, 224,  164, 191, ' ',
    224,  164, 174,  224, 165, 135,  224,  164, 130, ' ', 224,  164, 133, 224,
    164,  164, 224,  165, 141, 224,  164,  175, 224, 164, 130,  224, 164, 164,
    ' ',  224, 164,  170, 224, 164,  181,  224, 164, 191, 224,  164, 164, 224,
    165,  141, 224,  164, 176, ' ',  224,  164, 174, 224, 164,  190, 224, 164,
    168,  224, 165,  128, ' ', 224,  164,  156, 224, 164, 190,  224, 164, 164,
    224,  165, 128,  ' ', 224, 164,  185,  224, 165, 136, 224,  165, 164, ' ',
    224,  164, 133,  224, 164, 168,  224,  165, 141, 224, 164,  175, ' ', 224,
    164,  172, 224,  164, 161, 224,  164,  188, 224, 165, 128,  ' ', 224, 164,
    168,  224, 164,  166, 224, 164,  191,  224, 164, 175, 224,  164, 190, 224,
    164,  129, ' ',  224, 164, 184,  224,  164, 191, 224, 164,  168, 224, 165,
    141,  224, 164,  167, 224, 165,  129,  ',', ' ', 224, 164,  168, 224, 164,
    176,  224, 165,  141, 224, 164,  174,  224, 164, 166, 224,  164, 190, ',',
    ' ',  224, 164,  172, 224, 165,  141,  224, 164, 176, 224,  164, 185, 224,
    165,  141, 224,  164, 174, 224,  164,  170, 224, 165, 129,  224, 164, 164,
    224,  165, 141,  224, 164, 176,  ',',  ' ', 224, 164, 175,  224, 164, 174,
    224,  165, 129,  224, 164, 168,  224,  164, 190, ',', ' ',  224, 164, 151,
    224,  165, 139,  224, 164, 166,  224,  164, 190, 224, 164,  181, 224, 164,
    176,  224, 165,  128, ',', ' ',  224,  164, 149, 224, 164,  190, 224, 164,
    181,  224, 165,  135, 224, 164,  176,  224, 165, 128, ',',  ' ', 224, 164,
    149,  224, 165,  131, 224, 164,  183,  224, 165, 141, 224,  164, 163, 224,
    164,  190, ',',  ' ', 224, 164,  154,  224, 164, 174, 224,  165, 141, 224,
    164,  172, 224,  164, 178, ',',  ' ',  224, 164, 184, 224,  164, 164, 224,
    164,  178, 224,  164, 156, ',',  ' ',  224, 164, 181, 224,  165, 141, 224,
    164,  175, 224,  164, 190, 224,  164,  184, ' ', 224, 164,  134, 224, 164,
    166,  224, 164,  191, ' ', 224,  164,  185, 224, 165, 136,  224, 164, 130,
    224,  165, 164,  13,  10,  13,   10,   224, 164, 175, 224,  164, 185, ' ',
    224,  164, 181,  224, 164, 191,  224,  164, 182, 224, 165,  141, 224, 164,
    181,  ' ', 224,  164, 149, 224,  164,  190, ' ', 224, 164,  184, 224, 164,
    172,  224, 164,  184, 224, 165,  135,  ' ', 224, 164, 172,  224, 164, 161,
    224,  164, 188,  224, 164, 190,  ' ',  224, 164, 178, 224,  165, 139, 224,
    164,  149, 224,  164, 164, 224,  164,  130, 224, 164, 164,  224, 165, 141,
    224,  164, 176,  ' ', 224, 164,  185,  224, 165, 136, 224,  165, 164, ' ',
    224,  164, 175,  224, 164, 185,  224,  164, 190, 224, 164,  129, ' ', 224,
    165,  169, 224,  165, 166, 224,  165,  166, ' ', 224, 164,  184, 224, 165,
    135,  ' ', 224,  164, 133, 224,  164,  167, 224, 164, 191,  224, 164, 149,
    ' ',  224, 164,  173, 224, 164,  190,  224, 164, 183, 224,  164, 190, 224,
    164,  143, 224,  164, 129, ' ',  224,  164, 172, 224, 165,  139, 224, 164,
    178,  224, 165,  128, ' ', 224,  164,  156, 224, 164, 190,  224, 164, 164,
    224,  165, 128,  ' ', 224, 164,  185,  224, 165, 136, 224,  164, 130, ' ',
    '[',  '1', ']',  224, 165, 164,  ' ',  224, 164, 175, 224,  164, 185, ' ',
    224,  164, 181,  224, 164, 191,  224,  164, 182, 224, 165,  141, 224, 164,
    181,  ' ', 224,  164, 149, 224,  165,  128, ' ', 224, 164,  149, 224, 165,
    129,  224, 164,  155, ' ', 224,  164,  170, 224, 165, 141,  224, 164, 176,
    224,  164, 190,  224, 164, 154,  224,  165, 128, 224, 164,  168, 224, 164,
    164,  224, 164,  174, ' ', 224,  164,  184, 224, 164, 173,  224, 165, 141,
    224,  164, 175,  224, 164, 164,  224,  164, 190, 224, 164,  147, 224, 164,
    130,  ' ', 224,  164, 149, 224,  165,  128, ' ', 224, 164,  156, 224, 164,
    168,  224, 164,  168, 224, 165,  128,  ' ', 224, 164, 176,  224, 164, 185,
    224,  164, 190,  ' ', 224, 164,  185,  224, 165, 136, ' ',  224, 164, 156,
    224,  165, 136,  224, 164, 184,  224,  165, 135, ' ', '-',  ' ', 224, 164,
    184,  224, 164,  191, 224, 164,  168,  224, 165, 141, 224,  164, 167, 224,
    165,  129, ' ',  224, 164, 152,  224,  164, 190, 224, 164,  159, 224, 165,
    128,  ' ', 224,  164, 184, 224,  164,  173, 224, 165, 141,  224, 164, 175,
    224,  164, 164,  224, 164, 190,  ',',  ' ', 224, 164, 148,  224, 164, 176,
    ' ',  224, 164,  174, 224, 164,  185,  224, 164, 164, 224,  165, 141, 224,
    164,  181, 224,  164, 170, 224,  165,  130, 224, 164, 176,  224, 165, 141,
    224,  164, 163,  ' ', 224, 164,  144,  224, 164, 164, 224,  164, 191, 224,
    164,  185, 224,  164, 190, 224,  164,  184, 224, 164, 191,  224, 164, 149,
    ' ',  224, 164,  181, 224, 165,  141,  224, 164, 175, 224,  164, 190, 224,
    164,  170, 224,  164, 190, 224,  164,  176, ' ', 224, 164,  170, 224, 164,
    165,  224, 165,  139, 224, 164,  130,  ' ', 224, 164, 149,  224, 164, 190,
    ' ',  224, 164,  133, 224, 164,  173,  224, 164, 191, 224,  164, 168, 224,
    165,  141, 224,  164, 168, ' ',  224,  164, 133, 224, 164,  130, 224, 164,
    151,  ' ', 224,  164, 173, 224,  165,  128, '.', ' ', 224,  164, 181, 224,
    164,  191, 224,  164, 182, 224,  165,  141, 224, 164, 181,  ' ', 224, 164,
    149,  224, 165,  135, ' ', 224,  164,  154, 224, 164, 190,  224, 164, 176,
    ' ',  224, 164,  170, 224, 165,  141,  224, 164, 176, 224,  164, 174, 224,
    165,  129, 224,  164, 150, ' ',  224,  164, 167, 224, 164,  176, 224, 165,
    141,  224, 164,  174, ' ', ':',  ' ',  224, 164, 184, 224,  164, 168, 224,
    164,  190, 224,  164, 164, 224,  164,  168, '-', 224, 164,  185, 224, 164,
    191,  224, 164,  168, 224, 165,  141,  224, 164, 166, 224,  165, 130, ',',
    ' ',  224, 164,  172, 224, 165,  140,  224, 164, 166, 224,  165, 141, 224,
    164,  167, ',',  ' ', 224, 164,  156,  224, 165, 136, 224,  164, 168, ' ',
    224,  164, 164,  224, 164, 165,  224,  164, 190, ' ', 224,  164, 184, 224,
    164,  191, 224,  164, 150, ' ',  224,  164, 173, 224, 164,  190, 224, 164,
    176,  224, 164,  164, ' ', 224,  164,  174, 224, 165, 135,  224, 164, 130,
    ' ',  224, 164,  185, 224, 165,  128,  ' ', 224, 164, 156,  224, 164, 168,
    224,  165, 141,  224, 164, 174,  224,  165, 135, ' ', 224,  164, 148, 224,
    164,  176, ' ',  224, 164, 181,  224,  164, 191, 224, 164,  149, 224, 164,
    184,  224, 164,  191, 224, 164,  164,  ' ', 224, 164, 185,  224, 165, 129,
    224,  164, 143,  224, 165, 164,  13,   10,  13,  10,  224,  164, 173, 224,
    164,  190, 224,  164, 176, 224,  164,  164, ' ', 224, 164,  173, 224, 165,
    140,  224, 164,  151, 224, 165,  139,  224, 164, 178, 224,  164, 191, 224,
    164,  149, ' ',  224, 164, 149,  224,  165, 141, 224, 164,  183, 224, 165,
    135,  224, 164,  164, 224, 165,  141,  224, 164, 176, 224,  164, 171, 224,
    164,  178, ' ',  224, 164, 149,  224,  165, 135, ' ', 224,  164, 134, 224,
    164,  167, 224,  164, 190, 224,  164,  176, ' ', 224, 164,  170, 224, 164,
    176,  ' ', 224,  164, 181, 224,  164,  191, 224, 164, 182,  224, 165, 141,
    224,  164, 181,  ' ', 224, 164,  149,  224, 164, 190, ' ',  224, 164, 184,
    224,  164, 190,  224, 164, 164,  224,  164, 181, 224, 164,  190, 224, 164,
    129,  ' ', 224,  164, 184, 224,  164,  172, 224, 164, 184,  224, 165, 135,
    ' ',  224, 164,  172, 224, 164,  161,  224, 164, 188, 224,  164, 190, ' ',
    224,  164, 176,  224, 164, 190,  224,  164, 183, 224, 165,  141, 224, 164,
    159,  224, 165,  141, 224, 164,  176,  ' ', 224, 164, 185,  224, 165, 136,
    224,  165, 164,  ' ', 224, 164,  173,  224, 164, 190, 224,  164, 176, 224,
    164,  164, ' ',  224, 164, 149,  224,  165, 128, ' ', 224,  164, 176, 224,
    164,  190, 224,  164, 156, 224,  164,  167, 224, 164, 190,  224, 164, 168,
    224,  165, 128,  ' ', 224, 164,  168,  224, 164, 136, ' ',  224, 164, 166,
    224,  164, 191,  224, 164, 178,  224,  165, 141, 224, 164,  178, 224, 165,
    128,  ' ', 224,  164, 185, 224,  165,  136, 224, 165, 164,  ' ', 224, 164,
    173,  224, 164,  190, 224, 164,  176,  224, 164, 164, ' ',  224, 164, 149,
    224,  165, 135,  ' ', 224, 164,  133,  224, 164, 168, 224,  165, 141, 224,
    164,  175, ' ',  224, 164, 172,  224,  164, 161, 224, 164,  188, 224, 165,
    135,  ' ', 224,  164, 174, 224,  164,  185, 224, 164, 190,  224, 164, 168,
    224,  164, 151,  224, 164, 176,  ' ',  224, 164, 174, 224,  165, 129, 224,
    164,  174, 224,  165, 141, 224,  164,  172, 224, 164, 136,  ' ', '(', 224,
    164,  172, 224,  164, 174, 224,  165,  141, 224, 164, 172,  224, 164, 136,
    ')',  ',', ' ',  224, 164, 149,  224,  165, 139, 224, 164,  178, 224, 164,
    149,  224, 164,  190, 224, 164,  164,  224, 164, 190, ' ',  '(', 224, 164,
    149,  224, 164,  178, 224, 164,  149,  224, 164, 164, 224,  165, 141, 224,
    164,  164, 224,  164, 190, ')',  ' ',  224, 164, 148, 224,  164, 176, ' ',
    224,  164, 154,  224, 165, 135,  224,  164, 168, 224, 165,  141, 224, 164,
    168,  224, 164,  136, ' ', '(',  224,  164, 174, 224, 164,  166, 224, 165,
    141,  224, 164,  176, 224, 164,  190,  224, 164, 184, ')',  ' ', 224, 164,
    185,  224, 165,  136, 224, 164,  130,  224, 165, 164, ' ',  224, 165, 167,
    224,  165, 175,  224, 165, 170,  224,  165, 173, ' ', 224,  164, 174, 224,
    165,  135, 224,  164, 130, ' ',  224,  164, 184, 224, 165,  141, 224, 164,
    181,  224, 164,  164, 224, 164,  130,  224, 164, 164, 224,  165, 141, 224,
    164,  176, 224,  164, 164, 224,  164,  190, ' ', 224, 164,  170, 224, 165,
    141,  224, 164,  176, 224, 164,  190,  224, 164, 170, 224,  165, 141, 224,
    164,  164, 224,  164, 191, ' ',  224,  164, 184, 224, 165,  135, ' ', 224,
    164,  170, 224,  165, 130, 224,  164,  176, 224, 165, 141,  224, 164, 181,
    ' ',  224, 164,  172, 224, 165,  141,  224, 164, 176, 224,  164, 191, 224,
    164,  159, 224,  164, 191, 224,  164,  182, ' ', 224, 164,  173, 224, 164,
    190,  224, 164,  176, 224, 164,  164,  ' ', 224, 164, 149,  224, 165, 135,
    ' ',  224, 164,  176, 224, 165,  130,  224, 164, 170, ' ',  224, 164, 174,
    224,  165, 135,  224, 164, 130,  ' ',  224, 164, 172, 224,  165, 141, 224,
    164,  176, 224,  164, 191, 224,  164,  159, 224, 164, 191,  224, 164, 182,
    ' ',  224, 164,  184, 224, 164,  190,  224, 164, 174, 224,  165, 141, 224,
    164,  176, 224,  164, 190, 224,  164,  156, 224, 165, 141,  224, 164, 175,
    ' ',  224, 164,  149, 224, 165,  135,  ' ', 224, 164, 170,  224, 165, 141,
    224,  164, 176,  224, 164, 174,  224,  165, 129, 224, 164,  150, ' ', 224,
    164,  133, 224,  164, 130, 224,  164,  151, ' ', 224, 164,  173, 224, 164,
    190,  224, 164,  176, 224, 164,  164,  ' ', 224, 164, 168,  224, 165, 135,
    ' ',  224, 164,  181, 224, 164,  191,  224, 164, 151, 224,  164, 164, ' ',
    224,  165, 168,  224, 165, 166,  ' ',  224, 164, 181, 224,  164, 176, 224,
    165,  141, 224,  164, 183, ' ',  224,  164, 174, 224, 165,  135, 224, 164,
    130,  ' ', 224,  164, 184, 224,  164,  190, 224, 164, 176,  224, 165, 141,
    224,  164, 165,  224, 164, 149,  ' ',  224, 164, 170, 224,  165, 141, 224,
    164,  176, 224,  164, 151, 224,  164,  164, 224, 164, 191,  ' ', 224, 164,
    149,  224, 165,  128, ' ', 224,  164,  185, 224, 165, 136,  ',', ' ', 224,
    164,  181, 224,  164, 191, 224,  164,  182, 224, 165, 135,  224, 164, 183,
    ' ',  224, 164,  176, 224, 165,  130,  224, 164, 170, ' ',  224, 164, 184,
    224,  165, 135,  ' ', 224, 164,  134,  224, 164, 176, 224,  165, 141, 224,
    164,  165, 224,  164, 191, 224,  164,  149, ' ', 224, 164,  148, 224, 164,
    176,  ' ', 224,  164, 173, 224,  164,  190, 224, 164, 176,  224, 164, 164,
    224,  165, 128,  224, 164, 175,  ' ',  224, 164, 184, 224,  165, 135, 224,
    164,  168, 224,  164, 190, ' ',  224,  164, 143, 224, 164,  149, ' ', 224,
    164,  149, 224,  165, 141, 224,  164,  183, 224, 165, 135,  224, 164, 164,
    224,  165, 141,  224, 164, 176,  224,  165, 128, 224, 164,  175, ' ', 224,
    164,  182, 224,  164, 149, 224,  165,  141, 224, 164, 164,  224, 164, 191,
    ' ',  224, 164,  148, 224, 164,  176,  ' ', 224, 164, 181,  224, 164, 191,
    224,  164, 182,  224, 165, 141,  224,  164, 181, 224, 164,  181, 224, 165,
    141,  224, 164,  175, 224, 164,  190,  224, 164, 170, 224,  164, 149, ' ',
    224,  164, 182,  224, 164, 149,  224,  165, 141, 224, 164,  164, 224, 164,
    191,  ' ', 224,  164, 185, 224,  165,  136, 224, 165, 164,  ' ', 224, 164,
    173,  224, 164,  190, 224, 164,  176,  224, 164, 164, ' ',  224, 164, 181,
    224,  164, 191,  224, 164, 182,  224,  165, 141, 224, 164,  181, ' ', 224,
    164,  149, 224,  165, 128, ' ',  224,  164, 166, 224, 164,  184, 224, 164,
    181,  224, 165,  128, 224, 164,  130,  ' ', 224, 164, 184,  224, 164, 172,
    224,  164, 184,  224, 165, 135,  ' ',  224, 164, 172, 224,  164, 161, 224,
    164,  188, 224,  165, 128, ' ',  224,  164, 133, 224, 164,  176, 224, 165,
    141,  224, 164,  165, 224, 164,  181,  224, 165, 141, 224,  164, 175, 224,
    164,  181, 224,  164, 184, 224,  165,  141, 224, 164, 165,  224, 164, 190,
    ' ',  224, 164,  185, 224, 165,  136,  224, 165, 164, ' ',  224, 164, 185,
    224,  164, 190,  224, 164, 178,  ' ',  224, 164, 149, 224,  165, 135, ' ',
    224,  164, 181,  224, 164, 176,  224,  165, 141, 224, 164,  183, 224, 165,
    139,  224, 164,  130, ' ', 224,  164,  174, 224, 165, 135,  224, 164, 130,
    ' ',  224, 164,  173, 224, 164,  190,  224, 164, 176, 224,  164, 164, ' ',
    224,  164, 149,  224, 165, 128,  ' ',  224, 164, 133, 224,  164, 176, 224,
    165,  141, 224,  164, 165, 224,  164,  181, 224, 165, 141,  224, 164, 175,
    224,  164, 181,  224, 164, 184,  224,  165, 141, 224, 164,  165, 224, 164,
    190,  ' ', 224,  164, 168, 224,  165,  135, ' ', 224, 164,  172, 224, 164,
    185,  224, 165,  129, 224, 164,  164,  ' ', 224, 164, 170,  224, 165, 141,
    224,  164, 176,  224, 164, 151,  224,  164, 164, 224, 164,  191, ' ', 224,
    164,  149, 224,  165, 128, ' ',  224,  164, 185, 224, 165,  136, ',', ' ',
    224,  164, 148,  224, 164, 176,  ' ',  224, 164, 164, 224,  164, 190, 224,
    164,  156, 224,  164, 188, 224,  164,  190, ' ', 224, 164,  184, 224, 165,
    141,  224, 164,  165, 224, 164,  191,  224, 164, 164, 224,  164, 191, ' ',
    224,  164, 174,  224, 165, 135,  224,  164, 130, ' ', 224,  164, 173, 224,
    164,  190, 224,  164, 176, 224,  164,  164, ' ', 224, 164,  181, 224, 164,
    191,  224, 164,  182, 224, 165,  141,  224, 164, 181, ' ',  224, 164, 174,
    224,  165, 135,  224, 164, 130,  ' ',  224, 164, 164, 224,  165, 128, 224,
    164,  184, 224,  164, 176, 224,  165,  135, '-', 224, 164,  154, 224, 165,
    140,  224, 164,  165, 224, 165,  135,  ' ', 224, 164, 184,  224, 165, 141,
    224,  164, 165,  224, 164, 190,  224,  164, 168, ' ', 224,  164, 170, 224,
    164,  176, ' ',  224, 164, 185,  224,  165, 139, 224, 164,  168, 224, 165,
    135,  ' ', 224,  164, 149, 224,  164,  190, ' ', 224, 164,  166, 224, 164,
    190,  224, 164,  181, 224, 164,  190,  ' ', 224, 164, 149,  224, 164, 176,
    224,  164, 164,  224, 164, 190,  ' ',  224, 164, 185, 224,  165, 136, ' ',
    224,  165, 164,  13,  10,  13,   10,   224, 164, 173, 224,  164, 190, 224,
    164,  176, 224,  164, 164, ' ',  224,  164, 149, 224, 165,  135, ' ', 224,
    164,  166, 224,  165, 139, ' ',  224,  164, 134, 224, 164,  167, 224, 164,
    191,  224, 164,  149, 224, 164,  190,  224, 164, 176, 224,  164, 191, 224,
    164,  149, ' ',  224, 164, 168,  224,  164, 190, 224, 164,  174, ' ', 224,
    164,  185, 224,  165, 136, 224,  164,  130, '-', ' ', 224,  164, 185, 224,
    164,  191, 224,  164, 168, 224,  165,  141, 224, 164, 166,  224, 165, 128,
    ' ',  224, 164,  174, 224, 165,  135,  224, 164, 130, ' ',  224, 164, 173,
    224,  164, 190,  224, 164, 176,  224,  164, 164, ' ', 224,  164, 148, 224,
    164,  176, ' ',  224, 164, 133,  224,  164, 130, 224, 164,  151, 224, 165,
    141,  224, 164,  176, 224, 165,  135,  224, 164, 156, 224,  164, 188, 224,
    165,  128, ' ',  224, 164, 174,  224,  165, 135, 224, 164,  130, ' ', 224,
    164,  135, 224,  164, 163, 224,  165,  141, 224, 164, 161,  224, 164, 191,
    224,  164, 175,  224, 164, 190,  ' ',  '(', 'I', 'n', 'd',  'i', 'a', ')',
    224,  165, 164,  ' ', 224, 164,  135,  224, 164, 163, 224,  165, 141, 224,
    164,  161, 224,  164, 191, 224,  164,  175, 224, 164, 190,  ' ', 224, 164,
    168,  224, 164,  190, 224, 164,  174,  ' ', 224, 164, 149,  224, 165, 128,
    ' ',  224, 164,  137, 224, 164,  164,  224, 165, 141, 224,  164, 170, 224,
    164,  164, 224,  165, 141, 224,  164,  164, 224, 164, 191,  ' ', 224, 164,
    184,  224, 164,  191, 224, 164,  168,  224, 165, 141, 224,  164, 167, 224,
    165,  129, ' ',  224, 164, 168,  224,  164, 166, 224, 165,  128, ' ', 224,
    164,  149, 224,  165, 135, ' ',  224,  164, 133, 224, 164,  130, 224, 164,
    151,  224, 165,  141, 224, 164,  176,  224, 165, 135, 224,  164, 156, 224,
    165,  128, ' ',  224, 164, 168,  224,  164, 190, 224, 164,  174, ' ', '"',
    224,  164, 135,  224, 164, 163,  224,  165, 141, 224, 164,  161, 224, 164,
    184,  '"', ' ',  224, 164, 184,  224,  165, 135, ' ', 224,  164, 185, 224,
    165,  129, 224,  164, 136, ' ',  224,  164, 185, 224, 165,  136, 224, 165,
    164,  ' ', 224,  164, 173, 224,  164,  190, 224, 164, 176,  224, 164, 164,
    ' ',  224, 164,  168, 224, 164,  190,  224, 164, 174, ',',  ' ', 224, 164,
    143,  224, 164,  149, ' ', 224,  164,  170, 224, 165, 141,  224, 164, 176,
    224,  164, 190,  224, 164, 154,  224,  165, 128, 224, 164,  168, ' ', 224,
    164,  185, 224,  164, 191, 224,  164,  168, 224, 165, 141,  224, 164, 166,
    224,  165, 130,  ' ', 224, 164,  184,  224, 164, 174, 224,  165, 141, 224,
    164,  176, 224,  164, 190, 224,  164,  159, ' ', 224, 164,  173, 224, 164,
    176,  224, 164,  164, ' ', 224,  164,  156, 224, 165, 139,  ' ', 224, 164,
    149,  224, 164,  191, ' ', 224,  164,  174, 224, 164, 168,  224, 165, 129,
    ' ',  224, 164,  149, 224, 165,  135,  ' ', 224, 164, 181,  224, 164, 130,
    224,  164, 182,  224, 164, 156,  ' ',  224, 164, 139, 224,  164, 183, 224,
    164,  173, 224,  164, 166, 224,  165,  135, 224, 164, 181,  ' ', 224, 164,
    149,  224, 165,  135, ' ', 224,  164,  156, 224, 165, 141,  224, 164, 175,
    224,  165, 135,  224, 164, 183,  224,  165, 141, 224, 164,  160, ' ', 224,
    164,  170, 224,  165, 129, 224,  164,  164, 224, 165, 141,  224, 164, 176,
    ' ',  224, 164,  165, 224, 165,  135,  ' ', 224, 164, 164,  224, 164, 165,
    224,  164, 190,  ' ', 224, 164,  156,  224, 164, 191, 224,  164, 168, 224,
    164,  149, 224,  165, 128, ' ',  224,  164, 149, 224, 164,  165, 224, 164,
    190,  ' ', 224,  164, 182, 224,  165,  141, 224, 164, 176,  224, 165, 128,
    224,  164, 174,  224, 164, 166,  224,  165, 141, 224, 164,  173, 224, 164,
    190,  224, 164,  151, 224, 164,  181,  224, 164, 164, ' ',  224, 164, 174,
    224,  164, 185,  224, 164, 190,  224,  164, 170, 224, 165,  129, 224, 164,
    176,  224, 164,  190, 224, 164,  163,  ' ', 224, 164, 174,  224, 165, 135,
    224,  164, 130,  ' ', 224, 164,  185,  224, 165, 136, ',',  ' ', 224, 164,
    149,  224, 165,  135, ' ', 224,  164,  168, 224, 164, 190,  224, 164, 174,
    ' ',  224, 164,  184, 224, 165,  135,  ' ', 224, 164, 178,  224, 164, 191,
    224,  164, 175,  224, 164, 190,  ' ',  224, 164, 151, 224,  164, 175, 224,
    164,  190, ' ',  224, 164, 185,  224,  165, 136, 224, 165,  164, ' ', 224,
    164,  173, 224,  164, 190, 224,  164,  176, 224, 164, 164,  ' ', '(', 224,
    164,  173, 224,  164, 190, ' ',  '+',  ' ', 224, 164, 176,  224, 164, 164,
    ')',  ' ', 224,  164, 182, 224,  164,  172, 224, 165, 141,  224, 164, 166,
    ' ',  224, 164,  149, 224, 164,  190,  ' ', 224, 164, 174,  224, 164, 164,
    224,  164, 178,  224, 164, 172,  ' ',  224, 164, 185, 224,  165, 136, ' ',
    224,  164, 134,  224, 164, 168,  224,  165, 141, 224, 164,  164, 224, 164,
    176,  224, 164,  191, 224, 164,  149,  ' ', 224, 164, 170,  224, 165, 141,
    224,  164, 176,  224, 164, 149,  224,  164, 190, 224, 164,  182, ' ', 224,
    164,  175, 224,  164, 190, ' ',  224,  164, 181, 224, 164,  191, 224, 164,
    166,  224, 165,  135, 224, 164,  149,  '-', 224, 164, 176,  224, 165, 130,
    224,  164, 170,  224, 165, 128,  ' ',  224, 164, 170, 224,  165, 141, 224,
    164,  176, 224,  164, 149, 224,  164,  190, 224, 164, 182,  ' ', 224, 164,
    174,  224, 165,  135, 224, 164,  130,  ' ', 224, 164, 178,  224, 165, 128,
    224,  164, 168,  224, 165, 164,  ' ',  224, 164, 143, 224,  164, 149, ' ',
    224,  164, 164,  224, 165, 128,  224,  164, 184, 224, 164,  176, 224, 164,
    190,  ' ', 224,  164, 168, 224,  164,  190, 224, 164, 174,  ' ', 224, 164,
    185,  224, 164,  191, 224, 164,  168,  224, 165, 141, 224,  164, 166, 224,
    165,  129, 224,  164, 184, 224,  165,  141, 224, 164, 164,  224, 164, 190,
    224,  164, 168,  ' ', 224, 164,  173,  224, 165, 128, ' ',  224, 164, 185,
    224,  165, 136,  ' ', 224, 164,  156,  224, 164, 191, 224,  164, 184, 224,
    164,  149, 224,  164, 190, ' ',  224,  164, 133, 224, 164,  176, 224, 165,
    141,  224, 164,  165, ' ', 224,  164,  185, 224, 164, 191,  224, 164, 168,
    224,  165, 141,  224, 164, 166,  '(',  224, 164, 185, 224,  164, 191, 224,
    164,  168, 224,  165, 141, 224,  164,  166, 224, 165, 130,  ')', ' ', 224,
    164,  149, 224,  165, 128, ' ',  224,  164, 173, 224, 165,  130, 224, 164,
    174,  224, 164,  191, ' ', 224,  164,  185, 224, 165, 139,  224, 164, 164,
    224,  164, 190,  ' ', 224, 164,  185,  224, 165, 136, ' ',  224, 164, 156,
    224,  165, 139,  ' ', 224, 164,  149,  224, 164, 191, ' ',  224, 164, 170,
    224,  165, 141,  224, 164, 176,  224,  164, 190, 224, 164,  154, 224, 165,
    128,  224, 164,  168, ' ', 224,  164,  149, 224, 164, 190,  224, 164, 178,
    ' ',  224, 164,  139, 224, 164,  183,  224, 164, 191, 224,  164, 175, 224,
    165,  139, 224,  164, 130, ' ',  224,  164, 166, 224, 165,  141, 224, 164,
    181,  224, 164,  190, 224, 164,  176,  224, 164, 190, ' ',  224, 164, 166,
    224,  164, 191,  224, 164, 175,  224,  164, 190, ' ', 224,  164, 151, 224,
    164,  175, 224,  164, 190, ' ',  224,  164, 165, 224, 164,  190, 224, 165,
    164,  ' ', 224,  164, 170, 224,  165,  141, 224, 164, 176,  224, 164, 190,
    224,  164, 154,  224, 165, 128,  224,  164, 168, ' ', 224,  164, 149, 224,
    164,  190, 224,  164, 178, ' ',  224,  164, 174, 224, 165,  135, 224, 164,
    130,  ' ', 224,  164, 175, 224,  164,  185, ' ', 224, 164,  149, 224, 164,
    174,  ' ', 224,  164, 170, 224,  165,  141, 224, 164, 176,  224, 164, 175,
    224,  165, 129,  224, 164, 149,  224,  165, 141, 224, 164,  164, ' ', 224,
    164,  185, 224,  165, 139, 224,  164,  164, 224, 164, 190,  ' ', 224, 164,
    165,  224, 164,  190, ' ', 224,  164,  164, 224, 164, 165,  224, 164, 190,
    ' ',  224, 164,  149, 224, 164,  190,  224, 164, 178, 224,  164, 190, 224,
    164,  168, 224,  165, 141, 224,  164,  164, 224, 164, 176,  ' ', 224, 164,
    174,  224, 165,  135, 224, 164,  130,  ' ', 224, 164, 133,  224, 164, 167,
    224,  164, 191,  224, 164, 149,  ' ',  224, 164, 170, 224,  165, 141, 224,
    164,  176, 224,  164, 154, 224,  164,  178, 224, 164, 191,  224, 164, 164,
    ' ',  224, 164,  185, 224, 165,  129,  224, 164, 134, ' ',  224, 164, 181,
    224,  164, 191,  224, 164, 182,  224,  165, 135, 224, 164,  183, 224, 164,
    149,  224, 164,  176, ' ', 224,  164,  133, 224, 164, 176,  224, 164, 172,
    '/',  224, 164,  136, 224, 164,  176,  224, 164, 190, 224,  164, 168, ' ',
    224,  164, 174,  224, 165, 135,  224,  164, 130, 224, 165,  164, ' ', 224,
    164,  173, 224,  164, 190, 224,  164,  176, 224, 164, 164,  ' ', 224, 164,
    174,  224, 165,  135, 224, 164,  130,  ' ', 224, 164, 175,  224, 164, 185,
    ' ',  224, 164,  168, 224, 164,  190,  224, 164, 174, ' ',  224, 164, 174,
    224,  165, 129,  224, 164, 151,  224,  164, 178, ' ', 224,  164, 149, 224,
    164,  190, 224,  164, 178, ' ',  224,  164, 184, 224, 165,  135, ' ', 224,
    164,  133, 224,  164, 167, 224,  164,  191, 224, 164, 149,  ' ', 224, 164,
    170,  224, 165,  141, 224, 164,  176,  224, 164, 154, 224,  164, 178, 224,
    164,  191, 224,  164, 164, ' ',  224,  164, 185, 224, 165,  129, 224, 164,
    134,  ' ', 224,  164, 175, 224,  164,  166, 224, 165, 141,  224, 164, 175,
    224,  164, 170,  224, 164, 191,  ' ',  224, 164, 135, 224,  164, 184, 224,
    164,  149, 224,  164, 190, ' ',  224,  164, 184, 224, 164,  174, 224, 164,
    149,  224, 164,  190, 224, 164,  178,  224, 165, 128, 224,  164, 168, ' ',
    224,  164, 137,  224, 164, 170,  224,  164, 175, 224, 165,  139, 224, 164,
    151,  ' ', 224,  164, 149, 224,  164,  174, ' ', 224, 164,  148, 224, 164,
    176,  ' ', 224,  164, 170, 224,  165,  141, 224, 164, 176,  224, 164, 190,
    224,  164, 175,  224, 164, 131,  ' ',  224, 164, 137, 224,  164, 164, 224,
    165,  141, 224,  164, 164, 224,  164,  176, 224, 165, 128,  ' ', 224, 164,
    173,  224, 164,  190, 224, 164,  176,  224, 164, 164, ' ',  224, 164, 149,
    224,  165, 135,  ' ', 224, 164,  178,  224, 164, 191, 224,  164, 143, ' ',
    224,  164, 185,  224, 165, 139,  224,  164, 164, 224, 164,  190, ' ', 224,
    164,  185, 224,  165, 136, 224,  165,  164, ' ', 224, 164,  135, 224, 164,
    184,  224, 164,  149, 224, 165,  135,  ' ', 224, 164, 133,  224, 164, 164,
    224,  164, 191,  224, 164, 176,  224,  164, 191, 224, 164,  149, 224, 165,
    141,  224, 164,  164, ' ', 224,  164,  173, 224, 164, 190,  224, 164, 176,
    224,  164, 164,  224, 164, 181,  224,  164, 176, 224, 165,  141, 224, 164,
    183,  ' ', 224,  164, 149, 224,  165,  139, ' ', 224, 164,  181, 224, 165,
    136,  224, 164,  166, 224, 164,  191,  224, 164, 149, ' ',  224, 164, 149,
    224,  164, 190,  224, 164, 178,  ' ',  224, 164, 184, 224,  165, 135, ' ',
    224,  164, 134,  224, 164, 176,  224,  165, 141, 224, 164,  175, 224, 164,
    190,  224, 164,  181, 224, 164,  176,  224, 165, 141, 224,  164, 164, ' ',
    '"',  224, 164,  156, 224, 164,  174,  224, 165, 141, 224,  164, 172, 224,
    165,  130, 224,  164, 166, 224,  165,  141, 224, 164, 181,  224, 165, 128,
    224,  164, 170,  '"', ' ', 224,  164,  148, 224, 164, 176,  ' ', '"', 224,
    164,  133, 224,  164, 156, 224,  164,  168, 224, 164, 190,  224, 164, 173,
    224,  164, 166,  224, 165, 135,  224,  164, 182, '"', ' ',  224, 164, 149,
    224,  165, 135,  ' ', 224, 164,  168,  224, 164, 190, 224,  164, 174, ' ',
    224,  164, 184,  224, 165, 135,  ' ',  224, 164, 173, 224,  165, 128, ' ',
    224,  164, 156,  224, 164, 190,  224,  164, 168, 224, 164,  190, ' ', 224,
    164,  156, 224,  164, 190, 224,  164,  164, 224, 164, 190,  ' ', 224, 164,
    176,  224, 164,  185, 224, 164,  190,  ' ', 224, 164, 185,  224, 165, 136,
    224,  165, 164,  ' ', 224, 164,  172,  224, 164, 185, 224,  165, 129, 224,
    164,  164, ' ',  224, 164, 170,  224,  164, 185, 224, 164,  178, 224, 165,
    135,  ' ', 224,  164, 175, 224,  164,  185, ' ', 224, 164,  166, 224, 165,
    135,  224, 164,  182, ' ', '\'', 224,  164, 184, 224, 165,  139, 224, 164,
    168,  224, 165,  135, ' ', 224,  164,  149, 224, 165, 128,  ' ', 224, 164,
    154,  224, 164,  191, 224, 164,  161,  224, 164, 188, 224,  164, 191, 224,
    164,  175, 224,  164, 190, '\'', ' ',  224, 164, 149, 224,  165, 135, ' ',
    224,  164, 176,  224, 165, 130,  224,  164, 170, ' ', 224,  164, 174, 224,
    165,  135, 224,  164, 130, ' ',  224,  164, 156, 224, 164,  190, 224, 164,
    168,  224, 164,  190, ' ', 224,  164,  156, 224, 164, 190,  224, 164, 164,
    224,  164, 190,  ' ', 224, 164,  165,  224, 164, 190, 224,  165, 164, '[',
    '2',  ']', 13,   10,  13,  10,   'F',  'r', 'e', 'n', 'c',  'h', ':', 13,
    10,   13,  10,   'L', 'a', ' ',  'F',  'r', 'a', 'n', 'c',  'e', ',', ' ',
    'e',  'n', ' ',  'f', 'o', 'r',  'm',  'e', ' ', 'l', 'o',  'n', 'g', 'u',
    'e',  ' ', 'l',  'a', ' ', 'R',  195,  169, 'p', 'u', 'b',  'l', 'i', 'q',
    'u',  'e', ' ',  'f', 'r', 'a',  'n',  195, 167, 'a', 'i',  's', 'e', ',',
    ' ',  'e', 's',  't', ' ', 'u',  'n',  'e', ' ', 'r', 195,  169, 'p', 'u',
    'b',  'l', 'i',  'q', 'u', 'e',  ' ',  'c', 'o', 'n', 's',  't', 'i', 't',
    'u',  't', 'i',  'o', 'n', 'n',  'e',  'l', 'l', 'e', ' ',  'u', 'n', 'i',
    't',  'a', 'i',  'r', 'e', ' ',  'd',  'o', 'n', 't', ' ',  'l', 'a', ' ',
    'm',  'a', 'j',  'e', 'u', 'r',  'e',  ' ', 'p', 'a', 'r',  't', 'i', 'e',
    ' ',  'd', 'u',  ' ', 't', 'e',  'r',  'r', 'i', 't', 'o',  'i', 'r', 'e',
    ' ',  'e', 't',  ' ', 'd', 'e',  ' ',  'l', 'a', ' ', 'p',  'o', 'p', 'u',
    'l',  'a', 't',  'i', 'o', 'n',  ' ',  's', 'o', 'n', 't',  ' ', 's', 'i',
    't',  'u', 195,  169, 's', ' ',  'e',  'n', ' ', 'E', 'u',  'r', 'o', 'p',
    'e',  ' ', 'o',  'c', 'c', 'i',  'd',  'e', 'n', 't', 'a',  'l', 'e', ',',
    ' ',  'm', 'a',  'i', 's', ' ',  'q',  'u', 'i', ' ', 'c',  'o', 'm', 'p',
    'r',  'e', 'n',  'd', ' ', 195,  169,  'g', 'a', 'l', 'e',  'm', 'e', 'n',
    't',  ' ', 'p',  'l', 'u', 's',  'i',  'e', 'u', 'r', 's',  ' ', 'r', 195,
    169,  'g', 'i',  'o', 'n', 's',  ' ',  'e', 't', ' ', 't',  'e', 'r', 'r',
    'i',  't', 'o',  'i', 'r', 'e',  's',  ' ', 'r', 195, 169,  'p', 'a', 'r',
    't',  'i', 's',  ' ', 'd', 'a',  'n',  's', ' ', 'l', 'e',  's', ' ', 'A',
    'm',  195, 169,  'r', 'i', 'q',  'u',  'e', 's', ',', ' ',  'l', 226, 128,
    153,  'o', 'c',  195, 169, 'a',  'n',  ' ', 'I', 'n', 'd',  'i', 'e', 'n',
    ' ',  'e', 't',  ' ', 'l', '\'', 'o',  'c', 195, 169, 'a',  'n', ' ', 'P',
    'a',  'c', 'i',  'f', 'i', 'q',  'u',  'e', '.', ' ', 'E',  'l', 'l', 'e',
    ' ',  'a', ' ',  'p', 'o', 'u',  'r',  ' ', 'c', 'a', 'p',  'i', 't', 'a',
    'l',  'e', ' ',  'P', 'a', 'r',  'i',  's', ',', ' ', 'p',  'o', 'u', 'r',
    ' ',  'l', 'a',  'n', 'g', 'u',  'e',  ' ', 'o', 'f', 'f',  'i', 'c', 'i',
    'e',  'l', 'l',  'e', ' ', 'l',  'e',  ' ', 'f', 'r', 'a',  'n', 195, 167,
    'a',  'i', 's',  ' ', 'e', 't',  ' ',  'p', 'o', 'u', 'r',  ' ', 'm', 'o',
    'n',  'n', 'a',  'i', 'e', ' ',  'l',  226, 128, 153, 'e',  'u', 'r', 'o',
    '.',  ' ', 'S',  'a', ' ', 'd',  'e',  'v', 'i', 's', 'e',  ' ', 'e', 's',
    't',  ' ', 194,  171, ' ', 'L',  'i',  'b', 'e', 'r', 't',  195, 169, ',',
    ' ',  195, 137,  'g', 'a', 'l',  'i',  't', 195, 169, ',',  ' ', 'F', 'r',
    'a',  't', 'e',  'r', 'n', 'i',  't',  195, 169, ' ', 194,  187, ',', ' ',
    'e',  't', ' ',  's', 'o', 'n',  ' ',  'd', 'r', 'a', 'p',  'e', 'a', 'u',
    ' ',  'e', 's',  't', ' ', 'c',  'o',  'n', 's', 't', 'i',  't', 'u', 195,
    169,  ' ', 'd',  'e', ' ', 't',  'r',  'o', 'i', 's', ' ',  'b', 'a', 'n',
    'd',  'e', 's',  ' ', 'v', 'e',  'r',  't', 'i', 'c', 'a',  'l', 'e', 's',
    ' ',  'r', 'e',  's', 'p', 'e',  'c',  't', 'i', 'v', 'e',  'm', 'e', 'n',
    't',  ' ', 'b',  'l', 'e', 'u',  'e',  ',', ' ', 'b', 'l',  'a', 'n', 'c',
    'h',  'e', ' ',  'e', 't', ' ',  'r',  'o', 'u', 'g', 'e',  '.', ' ', 'S',
    'o',  'n', ' ',  'h', 'y', 'm',  'n',  'e', ' ', 'e', 's',  't', ' ', 'L',
    'a',  ' ', 'M',  'a', 'r', 's',  'e',  'i', 'l', 'l', 'a',  'i', 's', 'e',
    '.',  ' ', 'S',  'o', 'n', ' ',  'p',  'r', 'i', 'n', 'c',  'i', 'p', 'e',
    ' ',  'e', 's',  't', ' ', 'g',  'o',  'u', 'v', 'e', 'r',  'n', 'e', 'm',
    'e',  'n', 't',  ' ', 'd', 'u',  ' ',  'p', 'e', 'u', 'p',  'l', 'e', ',',
    ' ',  'p', 'a',  'r', ' ', 'l',  'e',  ' ', 'p', 'e', 'u',  'p', 'l', 'e',
    ' ',  'e', 't',  ' ', 'p', 'o',  'u',  'r', ' ', 'l', 'e',  ' ', 'p', 'e',
    'u',  'p', 'l',  'e', '[', '3',  ']',  '.', 13,  10,  13,   10,  'L', 'a',
    ' ',  'F', 'r',  'a', 'n', 'c',  'e',  ' ', 'e', 's', 't',  ' ', 'u', 'n',
    ' ',  'p', 'a',  'y', 's', ' ',  'a',  'n', 'c', 'i', 'e',  'n', ',', ' ',
    'f',  'o', 'r',  'm', 195, 169,  ' ',  'a', 'u', ' ', 'H',  'a', 'u', 't',
    ' ',  'M', 'o',  'y', 'e', 'n',  ' ',  195, 130, 'g', 'e',  '.', ' ', 'A',
    'u',  ' ', 'X',  'I', 'X', 'e',  ' ',  's', 'i', 195, 168,  'c', 'l', 'e',
    ' ',  'e', 't',  ' ', 'd', 'a',  'n',  's', ' ', 'l', 'a',  ' ', 'p', 'r',
    'e',  'm', 'i',  195, 168, 'r',  'e',  ' ', 'm', 'o', 'i',  't', 'i', 195,
    169,  ' ', 'd',  'u', ' ', 'X',  'X',  'e', ' ', 's', 'i',  195, 168, 'c',
    'l',  'e', ',',  ' ', 'e', 'l',  'l',  'e', ' ', 'p', 'o',  's', 's', 195,
    168,  'd', 'e',  ' ', 'u', 'n',  ' ',  'v', 'a', 's', 't',  'e', ' ', 'e',
    'm',  'p', 'i',  'r', 'e', ' ',  'c',  'o', 'l', 'o', 'n',  'i', 'a', 'l',
    '.',  ' ', 195,  128, ' ', 'p',  'a',  'r', 't', 'i', 'r',  ' ', 'd', 'e',
    's',  ' ', 'a',  'n', 'n', 195,  169,  'e', 's', ' ', '1',  '9', '5', '0',
    ',',  ' ', 'e',  'l', 'l', 'e',  ' ',  'e', 's', 't', ' ',  'l', 226, 128,
    153,  'u', 'n',  ' ', 'd', 'e',  's',  ' ', 'a', 'c', 't',  'e', 'u', 'r',
    's',  ' ', 'd',  'e', ' ', 'l',  'a',  ' ', 'c', 'o', 'n',  's', 't', 'r',
    'u',  'c', 't',  'i', 'o', 'n',  ' ',  'd', 'e', ' ', 'l',  226, 128, 153,
    'U',  'n', 'i',  'o', 'n', ' ',  'e',  'u', 'r', 'o', 'p',  195, 169, 'e',
    'n',  'n', 'e',  '.', ' ', 'E',  'l',  'l', 'e', ' ', 'e',  's', 't', ' ',
    'u',  'n', 'e',  ' ', 'p', 'u',  'i',  's', 's', 'a', 'n',  'c', 'e', ' ',
    'n',  'u', 'c',  'l', 195, 169,  'a',  'i', 'r', 'e', ',',  ' ', 'e', 't',
    ' ',  'l', 226,  128, 153, 'u',  'n',  ' ', 'd', 'e', 's',  ' ', 'c', 'i',
    'n',  'q', ' ',  'm', 'e', 'm',  'b',  'r', 'e', 's', ' ',  'p', 'e', 'r',
    'm',  'a', 'n',  'e', 'n', 't',  's',  ' ', 'd', 'u', ' ',  'C', 'o', 'n',
    's',  'e', 'i',  'l', ' ', 'd',  'e',  ' ', 's', 195, 169,  'c', 'u', 'r',
    'i',  't', 195,  169, ' ', 'd',  'e',  's', ' ', 'N', 'a',  't', 'i', 'o',
    'n',  's', ' ',  'u', 'n', 'i',  'e',  's', '.', ' ', 'L',  'a', ' ', 'F',
    'r',  'a', 'n',  'c', 'e', ' ',  'j',  'o', 'u', 'e', ' ',  'u', 'n', ' ',
    'r',  195, 180,  'l', 'e', ' ',  'i',  'm', 'p', 'o', 'r',  't', 'a', 'n',
    't',  ' ', 'd',  'a', 'n', 's',  ' ',  'l', 226, 128, 153,  'h', 'i', 's',
    't',  'o', 'i',  'r', 'e', ' ',  'm',  'o', 'n', 'd', 'i',  'a', 'l', 'e',
    ' ',  'p', 'a',  'r', ' ', 'l',  226,  128, 153, 'i', 'n',  'f', 'l', 'u',
    'e',  'n', 'c',  'e', ' ', 'd',  'e',  ' ', 's', 'a', ' ',  'c', 'u', 'l',
    't',  'u', 'r',  'e', ' ', 'e',  't',  ' ', 'd', 'e', ' ',  's', 'e', 's',
    ' ',  'v', 'a',  'l', 'e', 'u',  'r',  's', ' ', 'd', 195,  169, 'm', 'o',
    'c',  'r', 'a',  't', 'i', 'q',  'u',  'e', 's', ',', ' ',  'l', 'a', 195,
    175,  'q', 'u',  'e', 's', ' ',  'e',  't', ' ', 'r', 195,  169, 'p', 'u',
    'b',  'l', 'i',  'c', 'a', 'i',  'n',  'e', 's', '.', 13,   10,  13,  10,
    'L',  'a', ' ',  'F', 'r', 'a',  'n',  'c', 'e', ' ', 'a',  ',', ' ', 'e',
    'n',  ' ', '2',  '0', '1', '0',  ',',  ' ', 'l', 'e', ' ',  'c', 'i', 'n',
    'q',  'u', 'i',  195, 168, 'm',  'e',  ' ', 'p', 'l', 'u',  's', ' ', 'i',
    'm',  'p', 'o',  'r', 't', 'a',  'n',  't', ' ', 'p', 'r',  'o', 'd', 'u',
    'i',  't', ' ',  'i', 'n', 't',  195,  169, 'r', 'i', 'e',  'u', 'r', ' ',
    'b',  'r', 'u',  't', ' ', 'a',  'u',  ' ', 'm', 'o', 'n',  'd', 'e', '.',
    ' ',  'S', 'o',  'n', ' ', 195,  169,  'c', 'o', 'n', 'o',  'm', 'i', 'e',
    ',',  ' ', 'd',  'e', ' ', 't',  'y',  'p', 'e', ' ', 'c',  'a', 'p', 'i',
    't',  'a', 'l',  'i', 's', 't',  'e',  ' ', 'a', 'v', 'e',  'c', ' ', 'u',
    'n',  'e', ' ',  'i', 'n', 't',  'e',  'r', 'v', 'e', 'n',  't', 'i', 'o',
    'n',  ' ', 195,  169, 't', 'a',  't',  'i', 'q', 'u', 'e',  ' ', 'a', 's',
    's',  'e', 'z',  ' ', 'f', 'o',  'r',  't', 'e', ',', ' ',  'f', 'a', 'i',
    't',  ' ', 'd',  226, 128, 153,  'e',  'l', 'l', 'e', ' ',  'u', 'n', ' ',
    'd',  'e', 's',  ' ', 'l', 'e',  'a',  'd', 'e', 'r', 's',  ' ', 'm', 'o',
    'n',  'd', 'i',  'a', 'u', 'x',  ' ',  'd', 'a', 'n', 's',  ' ', 'l', 'e',
    's',  ' ', 's',  'e', 'c', 't',  'e',  'u', 'r', 's', ' ',  'd', 'e', ' ',
    'l',  226, 128,  153, 'a', 'g',  'r',  'o', 'a', 'l', 'i',  'm', 'e', 'n',
    't',  'a', 'i',  'r', 'e', ',',  ' ',  'd', 'e', ' ', 'l',  226, 128, 153,
    'a',  195, 169,  'r', 'o', 'n',  'a',  'u', 't', 'i', 'q',  'u', 'e', ',',
    ' ',  'd', 'e',  ' ', 'l', 226,  128,  153, 'a', 'u', 't',  'o', 'm', 'o',
    'b',  'i', 'l',  'e', ',', ' ',  'd',  'e', 's', ' ', 'p',  'r', 'o', 'd',
    'u',  'i', 't',  's', ' ', 'd',  'e',  ' ', 'l', 'u', 'x',  'e', ',', ' ',
    'd',  'u', ' ',  't', 'o', 'u',  'r',  'i', 's', 'm', 'e',  ' ', 'e', 't',
    ' ',  'd', 'u',  ' ', 'n', 'u',  'c',  'l', 195, 169, 'a',  'i', 'r', 'e',
    '.',  13,  10,   13,  10,  'P',  'e',  'u', 'p', 'l', 195,  169, 'e', ' ',
    'd',  'e', ' ',  '6', '5', ',',  '3',  ' ', 'm', 'i', 'l',  'l', 'i', 'o',
    'n',  's', ' ',  'd', 226, 128,  153,  'h', 'a', 'b', 'i',  't', 'a', 'n',
    't',  's', ' ',  'a', 'u', ' ',  '1',  'e', 'r', ' ', 'j',  'a', 'n', 'v',
    'i',  'e', 'r',  ' ', '2', '0',  '1',  '2', '[', '4', ']',  ',', ' ', 'l',
    'a',  ' ', 'F',  'r', 'a', 'n',  'c',  'e', ' ', 'e', 's',  't', ' ', 'u',
    'n',  ' ', 'p',  'a', 'y', 's',  ' ',  'd', 195, 169, 'v',  'e', 'l', 'o',
    'p',  'p', 195,  169, ',', ' ',  'a',  'v', 'e', 'c', ' ',  'u', 'n', ' ',
    'i',  'n', 'd',  'i', 'c', 'e',  ' ',  'd', 'e', ' ', 'd',  195, 169, 'v',
    'e',  'l', 'o',  'p', 'p', 'e',  'm',  'e', 'n', 't', ' ',  'h', 'u', 'm',
    'a',  'i', 'n',  ' ', 't', 'r',  195,  168, 's', ' ', 195,  169, 'l', 'e',
    'v',  195, 169,  '[', '5', ']',  '.',  13,  10,  13,  10,   'L', 'a', ' ',
    'F',  'r', 'a',  'n', 'c', 'e',  ' ',  'm', 195, 169, 't',  'r', 'o', 'p',
    'o',  'l', 'i',  't', 'a', 'i',  'n',  'e', ' ', 'e', 's',  't', ' ', 's',
    'i',  't', 'u',  195, 169, 'e',  ' ',  195, 160, ' ', 'l',  226, 128, 153,
    'u',  'n', 'e',  ' ', 'd', 'e',  's',  ' ', 'e', 'x', 't',  'r', 195, 169,
    'm',  'i', 't',  195, 169, 's',  ' ',  'o', 'c', 'c', 'i',  'd', 'e', 'n',
    't',  'a', 'l',  'e', 's', ' ',  'd',  'e', ' ', 'l', 226,  128, 153, 'E',
    'u',  'r', 'o',  'p', 'e', '.',  ' ',  'E', 'l', 'l', 'e',  ' ', 'e', 's',
    't',  ' ', 'b',  'o', 'r', 'd',  195,  169, 'e', ' ', 'p',  'a', 'r', ' ',
    'l',  'a', ' ',  'm', 'e', 'r',  ' ',  'd', 'u', ' ', 'N',  'o', 'r', 'd',
    ' ',  'a', 'u',  ' ', 'n', 'o',  'r',  'd', ',', ' ', 'l',  'a', ' ', 'M',
    'a',  'n', 'c',  'h', 'e', ' ',  'a',  'u', ' ', 'n', 'o',  'r', 'd', '-',
    'o',  'u', 'e',  's', 't', ',',  ' ',  'l', 226, 128, 153,  'o', 'c', 195,
    169,  'a', 'n',  ' ', 'A', 't',  'l',  'a', 'n', 't', 'i',  'q', 'u', 'e',
    ' ',  195, 160,  ' ', 'l', 226,  128,  153, 'o', 'u', 'e',  's', 't', ' ',
    'e',  't', ' ',  'l', 'a', ' ',  'm',  'e', 'r', ' ', 'M',  195, 169, 'd',
    'i',  't', 'e',  'r', 'r', 'a',  'n',  195, 169, 'e', ' ',  'a', 'u', ' ',
    's',  'u', 'd',  '-', 'e', 's',  't',  '.', ' ', 'E', 'l',  'l', 'e', ' ',
    'e',  's', 't',  ' ', 'f', 'r',  'o',  'n', 't', 'a', 'l',  'i', 195, 168,
    'r',  'e', ' ',  'd', 'e', ' ',  'l',  'a', ' ', 'B', 'e',  'l', 'g', 'i',
    'q',  'u', 'e',  ' ', 'e', 't',  ' ',  'd', 'u', ' ', 'L',  'u', 'x', 'e',
    'm',  'b', 'o',  'u', 'r', 'g',  ' ',  'a', 'u', ' ', 'n',  'o', 'r', 'd',
    '-',  'e', 's',  't', ',', ' ',  'd',  'e', ' ', 'l', 226,  128, 153, 'A',
    'l',  'l', 'e',  'm', 'a', 'g',  'n',  'e', ' ', 'e', 't',  ' ', 'd', 'e',
    ' ',  'l', 'a',  ' ', 'S', 'u',  'i',  's', 's', 'e', ' ',  195, 160, ' ',
    'l',  226, 128,  153, 'e', 's',  't',  ',', ' ', 'd', 'e',  ' ', 'l', 226,
    128,  153, 'I',  't', 'a', 'l',  'i',  'e', ' ', 'e', 't',  ' ', 'd', 'e',
    ' ',  'M', 'o',  'n', 'a', 'c',  'o',  ' ', 'a', 'u', ' ',  's', 'u', 'd',
    '-',  'e', 's',  't', ',', ' ',  'd',  'e', ' ', 'l', 226,  128, 153, 'E',
    's',  'p', 'a',  'g', 'n', 'e',  ' ',  'e', 't', ' ', 'd',  226, 128, 153,
    'A',  'n', 'd',  'o', 'r', 'r',  'e',  ' ', 'a', 'u', ' ',  's', 'u', 'd',
    '-',  'o', 'u',  'e', 's', 't',  '.',  ' ', 'S', 'i', ' ',  'l', 'e', 's',
    ' ',  'f', 'r',  'o', 'n', 't',  'i',  195, 168, 'r', 'e',  's', ' ', 'd',
    'u',  ' ', 's',  'u', 'd', ' ',  'd',  'u', ' ', 'p', 'a',  'y', 's', ' ',
    'c',  'o', 'r',  'r', 'e', 's',  'p',  'o', 'n', 'd', 'e',  'n', 't', ' ',
    195,  160, ' ',  'd', 'e', 's',  ' ',  'm', 'a', 's', 's',  'i', 'f', 's',
    ' ',  'm', 'o',  'n', 't', 'a',  'g',  'n', 'e', 'u', 'x',  ',', ' ', 'l',
    'e',  's', ' ',  'f', 'r', 'o',  'n',  't', 'i', 195, 168,  'r', 'e', 's',
    ' ',  'd', 'u',  ' ', 'n', 'o',  'r',  'd', '-', 'e', 's',  't', ' ', 'n',
    'e',  ' ', 'c',  'o', 'r', 'r',  'e',  's', 'p', 'o', 'n',  'd', 'e', 'n',
    't',  ' ', 195,  160, ' ', 'a',  'u',  'c', 'u', 'n', 'e',  ' ', 'l', 'i',
    'm',  'i', 't',  'e', ' ', 'g',  195,  169, 'o', 'g', 'r',  'a', 'p', 'h',
    'i',  'q', 'u',  'e', '[', 'n',  'o',  't', 'e', ' ', '6',  ']', ' ', 'n',
    'i',  ' ', 'l',  'i', 'n', 'g',  'u',  'i', 's', 't', 'i',  'q', 'u', 'e',
    '[',  'n', 'o',  't', 'e', ' ',  '7',  ']', '.', ' ', 'L',  'a', ' ', 'F',
    'r',  'a', 'n',  'c', 'e', ' ',  'm',  195, 169, 't', 'r',  'o', 'p', 'o',
    'l',  'i', 't',  'a', 'i', 'n',  'e',  ' ', 'c', 'o', 'm',  'p', 'r', 'e',
    'n',  'd', ' ',  'p', 'l', 'u',  's',  'i', 'e', 'u', 'r',  's', ' ', 195,
    174,  'l', 'e',  's', ',', ' ',  'n',  'o', 't', 'a', 'm',  'm', 'e', 'n',
    't',  ' ', 'l',  'a', ' ', 'C',  'o',  'r', 's', 'e', ' ',  'e', 't', ' ',
    'd',  'e', 's',  ' ', 195, 174,  'l',  'e', 's', ' ', 'c',  195, 180, 't',
    'i',  195, 168,  'r', 'e', 's',  '.',  ' ', 'L', 'a', ' ',  'm', 195, 169,
    't',  'r', 'o',  'p', 'o', 'l',  'e',  ' ', 'e', 's', 't',  ' ', 'c', 'o',
    'm',  'p', 'r',  'i', 's', 'e',  ' ',  'e', 'n', 't', 'r',  'e', ' ', 'l',
    'e',  's', ' ',  'l', 'a', 't',  'i',  't', 'u', 'd', 'e',  's', ' ', '4',
    '2',  194, 176,  '1', '9', '\'', '4',  '6', '"', ' ', 'N',  ' ', 'e', 't',
    ' ',  '5', '1',  194, 176, '5',  '\'', '4', '7', '"', ' ',  'N', ',', ' ',
    'a',  'i', 'n',  's', 'i', ' ',  'q',  'u', 'e', ' ', 'l',  'e', 's', ' ',
    'l',  'o', 'n',  'g', 'i', 't',  'u',  'd', 'e', 's', ' ',  '4', 194, 176,
    '4',  '6', '\'', ' ', 'O', ' ',  'e',  't', ' ', '8', 194,  176, '1', '4',
    '\'', '4', '2',  '"', ' ', 'E',  '.',  13,  10,  13,  10,   'L', 'a', ' ',
    'F',  'r', 'a',  'n', 'c', 'e',  ' ',  'c', 'o', 'm', 'p',  'r', 'e', 'n',
    'd',  ' ', 195,  169, 'g', 'a',  'l',  'e', 'm', 'e', 'n',  't', ' ', 'd',
    'e',  ' ', 'n',  'o', 'm', 'b',  'r',  'e', 'u', 'x', ' ',  't', 'e', 'r',
    'r',  'i', 't',  'o', 'i', 'r',  'e',  's', ' ', 's', 'i',  't', 'u', 195,
    169,  's', ' ',  'e', 'n', '-',  'd',  'e', 'h', 'o', 'r',  's', ' ', 'd',
    'u',  ' ', 'c',  'o', 'n', 't',  'i',  'n', 'e', 'n', 't',  ' ', 'e', 'u',
    'r',  'o', 'p',  195, 169, 'e',  'n',  ',', ' ', 'c', 'o',  'u', 'r', 'a',
    'm',  'm', 'e',  'n', 't', ' ',  'a',  'p', 'p', 'e', 'l',  195, 169, 's',
    ' ',  't', 'e',  'r', 'r', 'i',  't',  'o', 'i', 'r', 'e',  's', ' ', 'd',
    226,  128, 153,  'o', 'u', 't',  'r',  'e', '-', 'm', 'e',  'r', ',', ' ',
    'n',  'a', 'g',  'u', 195, 168,  'r',  'e', ' ', 'D', 'O',  'M', '-', 'T',
    'O',  'M', ',',  ' ', 'q', 'u',  'i',  ' ', 'l', 'u', 'i',  ' ', 'p', 'e',
    'r',  'm', 'e',  't', 't', 'e',  'n',  't', ' ', 'd', 226,  128, 153, 195,
    170,  't', 'r',  'e', ' ', 'p',  'r',  195, 169, 's', 'e',  'n', 't', 'e',
    ' ',  'd', 'a',  'n', 's', ' ',  't',  'o', 'u', 's', ' ',  'l', 'e', 's',
    ' ',  'o', 'c',  195, 169, 'a',  'n',  's', '.', ' ', 'C',  'e', 's', ' ',
    't',  'e', 'r',  'r', 'i', 't',  'o',  'i', 'r', 'e', 's',  ' ', 'a', 'u',
    'x',  ' ', 's',  't', 'a', 't',  'u',  't', 's', ' ', 'v',  'a', 'r', 'i',
    195,  169, 's',  ' ', 's', 'o',  'n',  't', '[', '6', ']',  ' ', ':', 13,
    10,   13,  10,   's', 'u', 'r',  ' ',  'l', 'e', ' ', 'c',  'o', 'n', 't',
    'i',  'n', 'e',  'n', 't', ' ',  's',  'u', 'd', '-', 'a',  'm', 195, 169,
    'r',  'i', 'c',  'a', 'i', 'n',  ' ',  ':', ' ', 'l', 'a',  ' ', 'G', 'u',
    'y',  'a', 'n',  'e', ' ', ';',  13,   10,  'd', 'a', 'n',  's', ' ', 'l',
    226,  128, 153,  'o', 'c', 195,  169,  'a', 'n', ' ', 'A',  't', 'l', 'a',
    'n',  't', 'i',  'q', 'u', 'e',  ' ',  '(', 'A', 'n', 't',  'i', 'l', 'l',
    'e',  's', ')',  ' ', ':', ' ',  'l',  'a', ' ', 'G', 'u',  'a', 'd', 'e',
    'l',  'o', 'u',  'p', 'e', ',',  ' ',  'l', 'a', ' ', 'M',  'a', 'r', 't',
    'i',  'n', 'i',  'q', 'u', 'e',  ',',  ' ', 'S', 'a', 'i',  'n', 't', '-',
    'P',  'i', 'e',  'r', 'r', 'e',  '-',  'e', 't', '-', 'M',  'i', 'q', 'u',
    'e',  'l', 'o',  'n', ',', ' ',  'S',  'a', 'i', 'n', 't',  '-', 'M', 'a',
    'r',  't', 'i',  'n', ' ', 'e',  't',  ' ', 'S', 'a', 'i',  'n', 't', '-',
    'B',  'a', 'r',  't', 'h', 195,  169,  'l', 'e', 'm', 'y',  ' ', ';', 13,
    10,   'd', 'a',  'n', 's', ' ',  'l',  226, 128, 153, 'o',  'c', 195, 169,
    'a',  'n', ' ',  'P', 'a', 'c',  'i',  'f', 'i', 'q', 'u',  'e', ' ', ':',
    ' ',  'l', 'a',  ' ', 'P', 'o',  'l',  'y', 'n', 195, 169,  's', 'i', 'e',
    ' ',  'f', 'r',  'a', 'n', 195,  167,  'a', 'i', 's', 'e',  ',', ' ', 'l',
    'a',  ' ', 'N',  'o', 'u', 'v',  'e',  'l', 'l', 'e', '-',  'C', 'a', 'l',
    195,  169, 'd',  'o', 'n', 'i',  'e',  ',', ' ', 'W', 'a',  'l', 'l', 'i',
    's',  '-', 'e',  't', '-', 'F',  'u',  't', 'u', 'n', 'a',  ' ', 'e', 't',
    ' ',  'C', 'l',  'i', 'p', 'p',  'e',  'r', 't', 'o', 'n',  ' ', ';', 13,
    10,   'd', 'a',  'n', 's', ' ',  'l',  226, 128, 153, 'o',  'c', 195, 169,
    'a',  'n', ' ',  'I', 'n', 'd',  'i',  'e', 'n', ' ', ':',  ' ', 'L', 'a',
    ' ',  'R', 195,  169, 'u', 'n',  'i',  'o', 'n', ',', ' ',  'M', 'a', 'y',
    'o',  't', 't',  'e', ',', ' ',  'l',  'e', 's', ' ', 195,  142, 'l', 'e',
    's',  ' ', 195,  137, 'p', 'a',  'r',  's', 'e', 's', ',',  ' ', 'l', 'e',
    's',  ' ', 195,  142, 'l', 'e',  's',  ' ', 'C', 'r', 'o',  'z', 'e', 't',
    ',',  ' ', 'l',  'e', 's', ' ',  195,  142, 'l', 'e', 's',  ' ', 'K', 'e',
    'r',  'g', 'u',  'e', 'l', 'e',  'n',  ' ', 'e', 't', ' ',  'S', 'a', 'i',
    'n',  't', '-',  'P', 'a', 'u',  'l',  '-', 'e', 't', '-',  'A', 'm', 's',
    't',  'e', 'r',  'd', 'a', 'm',  ' ',  ';', 13,  10,  'e',  'n', ' ', 'A',
    'n',  't', 'a',  'r', 'c', 't',  'i',  'q', 'u', 'e', ' ',  ':', ' ', 'l',
    'a',  ' ', 'T',  'e', 'r', 'r',  'e',  ' ', 'A', 'd', 195,  169, 'l', 'i',
    'e',  '[', 'n',  'o', 't', 'e',  ' ',  '8', ']', '.', 13,   10,  195, 128,
    ' ',  't', 'r',  'a', 'v', 'e',  'r',  's', ' ', 's', 'e',  's', ' ', 'c',
    'o',  'l', 'l',  'e', 'c', 't',  'i',  'v', 'i', 't', 195,  169, 's', ' ',
    'u',  'l', 't',  'r', 'a', '-',  'm',  'a', 'r', 'i', 'n',  'e', 's', ',',
    ' ',  'l', 'a',  ' ', 'F', 'r',  'a',  'n', 'c', 'e', ' ',  'p', 'o', 's',
    's',  195, 168,  'd', 'e', ' ',  195,  169, 'g', 'a', 'l',  'e', 'm', 'e',
    'n',  't', ' ',  'd', 'e', 's',  ' ',  'f', 'r', 'o', 'n',  't', 'i', 195,
    168,  'r', 'e',  's', ' ', 't',  'e',  'r', 'r', 'e', 's',  't', 'r', 'e',
    's',  ' ', 'a',  'v', 'e', 'c',  ' ',  'l', 'e', ' ', 'B',  'r', 195, 169,
    's',  'i', 'l',  ' ', 'e', 't',  ' ',  'l', 'e', ' ', 'S',  'u', 'r', 'i',
    'n',  'a', 'm',  'e', ',', ' ',  'a',  'i', 'n', 's', 'i',  ' ', 'q', 'u',
    226,  128, 153,  'a', 'v', 'e',  'c',  ' ', 'l', 'e', 's',  ' ', 'P', 'a',
    'y',  's', '-',  'B', 'a', 's',  ' ',  'v', 'i', 'a', ' ',  'l', 'a', ' ',
    'p',  'a', 'r',  't', 'i', 'e',  ' ',  'f', 'r', 'a', 'n',  195, 167, 'a',
    'i',  's', 'e',  ' ', 'd', 'e',  ' ',  'S', 'a', 'i', 'n',  't', '-', 'M',
    'a',  'r', 't',  'i', 'n', '.',  13,   10,  13,  10,  'L',  'a', ' ', 's',
    'u',  'p', 'e',  'r', 'f', 'i',  'c',  'i', 'e', ' ', 'd',  'e', ' ', 'l',
    'a',  ' ', 'F',  'r', 'a', 'n',  'c',  'e', ' ', 'e', 's',  't', ' ', 'd',
    'e',  ' ', '6',  '7', '0', ' ',  '9',  '2', '2', ' ', 'k',  'm', 194, 178,
    ',',  ' ', 'o',  'u', ' ', '5',  '4',  '7', ' ', '0', '3',  '0', ' ', 's',
    'a',  'n', 's',  ' ', 'c', 'o',  'm',  'p', 't', 'a', 'b',  'i', 'l', 'i',
    's',  'e', 'r',  ' ', 'l', 226,  128,  153, 'o', 'u', 't',  'r', 'e', '-',
    'm',  'e', 'r',  '[', '7', ']',  '.',  ' ', 'E', 'l', 'l',  'e', ' ', 'e',
    's',  't', ' ',  'l', 'e', ' ',  '4',  '1', 'e', ' ', 'p',  'l', 'u', 's',
    ' ',  'g', 'r',  'a', 'n', 'd',  ' ',  195, 137, 't', 'a',  't', ' ', 'd',
    'u',  ' ', 'm',  'o', 'n', 'd',  'e',  ' ', 'p', 'a', 'r',  ' ', 's', 'a',
    ' ',  's', 'u',  'r', 'f', 'a',  'c',  'e', ' ', 't', 'e',  'r', 'r', 'e',
    's',  't', 'r',  'e', '[', '7',  ']',  ' ', 'e', 't', ' ',  'l', 'e', ' ',
    'd',  'e', 'u',  'x', 'i', 195,  168,  'm', 'e', ' ', 'p',  'a', 'r', ' ',
    's',  'a', ' ',  'z', 'o', 'n',  'e',  ' ', 195, 169, 'c',  'o', 'n', 'o',
    'm',  'i', 'q',  'u', 'e', ' ',  'e',  'x', 'c', 'l', 'u',  's', 'i', 'v',
    'e',  '[', '8',  ']', '.', ' ',  'E',  'l', 'l', 'e', ' ',  'e', 's', 't',
    ' ',  'e', 'n',  ' ', 'o', 'u',  't',  'r', 'e', ' ', 'l',  'e', ' ', 't',
    'r',  'o', 'i',  's', 'i', 195,  168,  'm', 'e', ' ', 'p',  'l', 'u', 's',
    ' ',  'g', 'r',  'a', 'n', 'd',  ' ',  'p', 'a', 'y', 's',  ' ', 'd', 226,
    128,  153, 'E',  'u', 'r', 'o',  'p',  'e', ',', ' ', 'a',  'p', 'r', 195,
    168,  's', ' ',  'l', 'a', ' ',  'R',  'u', 's', 's', 'i',  'e', ' ', 'e',
    't',  ' ', 'l',  226, 128, 153,  'U',  'k', 'r', 'a', 'i',  'n', 'e', ',',
    ' ',  'd', 'e',  'u', 'x', 'i',  195,  168, 'm', 'e', ' ',  's', 'i', ' ',
    'o',  'n', ' ',  'i', 'n', 'c',  'l',  'u', 't', ' ', 'l',  'e', 's', ' ',
    'd',  195, 169,  'p', 'a', 'r',  't',  'e', 'm', 'e', 'n',  't', 's', ' ',
    'u',  'l', 't',  'r', 'a', '-',  'm',  'a', 'r', 'i', 'n',  's', ',', ' ',
    'e',  't', ' ',  'l', 'e', ' ',  'p',  'l', 'u', 's', ' ',  'g', 'r', 'a',
    'n',  'd', ' ',  'd', 'e', ' ',  'l',  226, 128, 153, 'U',  'n', 'i', 'o',
    'n',  ' ', 'e',  'u', 'r', 'o',  'p',  195, 169, 'e', 'n',  'n', 'e', '[',
    '7',  ']', '.',  ' ', 'S', 'o',  'n',  ' ', 't', 'e', 'r',  'r', 'i', 't',
    'o',  'i', 'r',  'e', ' ', 'm',  195,  169, 't', 'r', 'o',  'p', 'o', 'l',
    'i',  't', 'a',  'i', 'n', ' ',  'c',  'o', 'n', 't', 'i',  'n', 'e', 'n',
    't',  'a', 'l',  ' ', 's', 226,  128,  153, 195, 169, 't',  'e', 'n', 'd',
    ' ',  's', 'u',  'r', ' ', 'e',  'n',  'v', 'i', 'r', 'o',  'n', ' ', '1',
    ' ',  '0', '0',  '0', ' ', 'k',  'm',  ' ', 'd', 'u', ' ',  'n', 'o', 'r',
    'd',  ' ', 'a',  'u', ' ', 's',  'u',  'd', ' ', 'e', 't',  ' ', 'd', 226,
    128,  153, 'e',  's', 't', ' ',  'e',  'n', ' ', 'o', 'u',  'e', 's', 't',
    '.',  ' ', 'L',  226, 128, 153,  195,  169, 't', 'e', 'n',  'd', 'u', 'e',
    ' ',  'd', 'e',  ' ', 's', 'o',  'n',  ' ', 'l', 'i', 't',  't', 'o', 'r',
    'a',  'l', ',',  ' ', 'o', 'u',  't',  'r', 'e', '-', 'm',  'e', 'r', ' ',
    'i',  'n', 'c',  'l', 'u', 's',  ',',  ' ', 'e', 's', 't',  ' ', 'd', 'e',
    ' ',  '8', ' ',  '2', '4', '5',  ' ',  'k', 'm', '[', '9',  ']', '.', 13,
    10,   13,  10,   'G', 'r', 'e',  'e',  'k', ':', 13,  10,   13,  10,  206,
    151,  ' ', 206,  149, 206, 187,  206,  187, 206, 172, 206,  180, 206, 177,
    ' ',  '(', 207,  128, 206, 177,  206,  187, 206, 177, 206,  185, 207, 140,
    207,  132, 206,  181, 207, 129,  206,  177, ':', ' ', 225,  188, 153, 206,
    187,  206, 187,  206, 172, 207,  130,  ',', ' ', 206, 181,  207, 128, 206,
    175,  207, 131,  206, 183, 206,  188,  206, 177, ':', ' ',  206, 149, 206,
    187,  206, 187,  206, 183, 206,  189,  206, 185, 206, 186,  206, 174, ' ',
    206,  148, 206,  183, 206, 188,  206,  191, 206, 186, 207,  129, 206, 177,
    207,  132, 206,  175, 206, 177,  ')',  ' ', 206, 181, 206,  175, 206, 189,
    206,  177, 206,  185, ' ', 207,  135,  207, 142, 207, 129,  206, 177, ' ',
    207,  128, 206,  191, 207, 133,  ' ',  206, 178, 207, 129,  206, 175, 207,
    131,  206, 186,  206, 181, 207,  132,  206, 177, 206, 185,  ' ', 207, 131,
    207,  132, 206,  183, ' ', 206,  189,  206, 191, 207, 132,  206, 185, 206,
    191,  206, 177,  206, 189, 206,  177,  207, 132, 206, 191,  206, 187, 206,
    185,  206, 186,  206, 174, ' ',  206,  149, 207, 133, 207,  129, 207, 142,
    207,  128, 206,  183, ',', ' ',  207,  131, 207, 132, 206,  191, ' ', 206,
    189,  206, 191,  207, 132, 206,  185,  207, 140, 207, 132,  206, 181, 207,
    129,  206, 191,  ' ', 206, 172,  206,  186, 207, 129, 206,  191, ' ', 207,
    132,  206, 183,  207, 130, ' ',  206,  146, 206, 177, 206,  187, 206, 186,
    206,  177, 206,  189, 206, 185,  206,  186, 206, 174, 207,  130, ' ', 207,
    135,  206, 181,  207, 129, 207,  131,  206, 191, 206, 189,  206, 174, 207,
    131,  206, 191,  207, 133, ',',  ' ',  207, 131, 207, 132,  206, 183, 206,
    189,  ' ', 206,  145, 206, 189,  206,  177, 207, 132, 206,  191, 206, 187,
    206,  185, 206,  186, 206, 174,  ' ',  206, 156, 206, 181,  207, 131, 207,
    140,  206, 179,  206, 181, 206,  185,  206, 191, '.', 206,  160, 207, 129,
    207,  137, 207,  132, 206, 181,  207,  141, 206, 191, 207,  133, 207, 131,
    206,  177, ' ',  207, 132, 206,  183,  207, 130, ' ', 206,  149, 206, 187,
    206,  187, 206,  172, 206, 180,  206,  191, 207, 130, ' ',  206, 186, 206,
    177,  206, 185,  ' ', 206, 188,  206,  181, 206, 179, 206,  177, 206, 187,
    207,  141, 207,  132, 206, 181,  207,  129, 206, 183, ' ',  207, 128, 207,
    140,  206, 187,  206, 183, ' ',  206,  181, 206, 175, 206,  189, 206, 177,
    206,  185, ' ',  206, 183, ' ',  206,  145, 206, 184, 206,  174, 206, 189,
    206,  177, '.',  13,  10,  13,   10,   206, 163, 207, 133,  206, 189, 206,
    191,  207, 129,  206, 181, 207,  141,  206, 181, 206, 185,  ' ', 207, 131,
    207,  132, 206,  177, ' ', 206,  178,  206, 191, 207, 129,  206, 181, 206,
    185,  206, 191,  206, 180, 207,  133,  207, 132, 206, 185,  206, 186, 206,
    172,  ' ', 206,  188, 206, 181,  ' ',  207, 132, 206, 183,  206, 189, ' ',
    206,  145, 206,  187, 206, 178,  206,  177, 206, 189, 206,  175, 206, 177,
    ',',  ' ', 207,  131, 207, 132,  206,  177, ' ', 206, 178,  207, 140, 207,
    129,  206, 181,  206, 185, 206,  177,  ' ', 206, 188, 206,  181, ' ', 207,
    132,  206, 183,  ' ', 206, 146,  206,  191, 207, 133, 206,  187, 206, 179,
    206,  177, 207,  129, 206, 175,  206,  177, ' ', 206, 186,  206, 177, 206,
    185,  ' ', 207,  132, 206, 183,  206,  189, ' ', 207, 128,  207, 129, 207,
    142,  206, 183,  206, 189, ' ',  206,  147, 206, 185, 206,  191, 207, 133,
    206,  179, 206,  186, 206, 191,  207,  131, 206, 187, 206,  177, 206, 178,
    206,  185, 206,  186, 206, 174,  ' ',  206, 148, 206, 183,  206, 188, 206,
    191,  206, 186,  207, 129, 206,  177,  207, 132, 206, 175,  206, 177, ' ',
    207,  132, 206,  183, 207, 130,  ' ',  206, 156, 206, 177,  206, 186, 206,
    181,  206, 180,  206, 191, 206,  189,  206, 175, 206, 177,  207, 130, ' ',
    '(',  207, 128,  '.', 206, 147,  '.',  206, 148, '.', 206,  156, '.', ')',
    ' ',  206, 186,  206, 177, 206,  185,  ' ', 207, 131, 207,  132, 206, 177,
    ' ',  206, 178,  206, 191, 207,  129,  206, 181, 206, 185,  206, 191, 206,
    177,  206, 189,  206, 177, 207,  132,  206, 191, 206, 187,  206, 185, 206,
    186,  206, 172,  ' ', 206, 188,  206,  181, ' ', 207, 132,  206, 183, 206,
    189,  ' ', 206,  164, 206, 191,  207,  133, 207, 129, 206,  186, 206, 175,
    206,  177, '.',  ' ', 206, 146,  207,  129, 206, 173, 207,  135, 206, 181,
    207,  132, 206,  177, 206, 185,  ' ',  207, 131, 207, 132,  206, 177, ' ',
    206,  177, 206,  189, 206, 177,  207,  132, 206, 191, 206,  187, 206, 185,
    206,  186, 206,  172, ' ', 206,  177,  207, 128, 207, 140,  ' ', 207, 132,
    206,  191, ' ',  206, 145, 206,  185,  206, 179, 206, 177,  206, 175, 206,
    191,  ' ', 206,  160, 206, 173,  206,  187, 206, 177, 206,  179, 206, 191,
    207,  130, ',',  ' ', 207, 131,  207,  132, 206, 177, ' ',  206, 180, 207,
    133,  207, 132,  206, 185, 206,  186,  206, 172, ' ', 206,  177, 207, 128,
    207,  140, ' ',  207, 132, 206,  191,  ' ', 206, 153, 207,  140, 206, 189,
    206,  185, 206,  191, ' ', 206,  186,  206, 177, 206, 185,  ' ', 206, 189,
    207,  140, 207,  132, 206, 185,  206,  177, ' ', 206, 177,  207, 128, 207,
    140,  ' ', 207,  132, 206, 183,  ' ',  206, 156, 206, 181,  207, 131, 207,
    140,  206, 179,  206, 181, 206,  185,  206, 191, ' ', 206,  152, 206, 172,
    206,  187, 206,  177, 207, 131,  207,  131, 206, 177, '.',  206, 151, ' ',
    206,  149, 206,  187, 206, 187,  206,  172, 206, 180, 206,  177, ' ', 206,
    186,  206, 177,  207, 132, 206,  173,  207, 135, 206, 181,  206, 185, ' ',
    207,  132, 206,  183, 206, 189,  ' ',  '1', '1', 206, 183,  ' ', 206, 184,
    206,  173, 207,  131, 206, 183,  ' ',  207, 131, 207, 132,  206, 185, 207,
    130,  ' ', 207,  135, 207, 142,  207,  129, 206, 181, 207,  130, ' ', 206,
    188,  206, 181,  ' ', 207, 132,  206,  183, ' ', 206, 188,  206, 181, 206,
    179,  206, 177,  206, 187, 207,  141,  207, 132, 206, 181,  207, 129, 206,
    183,  ' ', 206,  177, 206, 186,  207,  132, 206, 191, 206,  179, 207, 129,
    206,  177, 206,  188, 206, 188,  206,  174, ' ', 207, 131,  207, 132, 206,
    177,  ' ', '1',  '3', '.', '6',  '7',  '6', ' ', 207, 135,  206, 185, 206,
    187,  206, 185,  207, 140, 206,  188,  206, 181, 207, 132,  207, 129, 206,
    177,  ' ', 206,  186, 206, 177,  206,  184, 207, 142, 207,  130, ' ', 206,
    181,  207, 135,  206, 181, 206,  185,  ' ', 207, 128, 206,  191, 206, 187,
    206,  187, 206,  172, ' ', 206,  189,  206, 183, 207, 131,  206, 185, 206,
    172,  ' ', '(',  207, 128, 206,  181,  207, 129, 206, 175,  207, 128, 206,
    191,  207, 133,  ' ', '1', '.',  '4',  '0', '0', ',', ' ',  206, 181, 206,
    186,  207, 132,  207, 137, 206,  189,  ' ', 206, 191, 207,  128, 206, 191,
    206,  175, 207,  137, 206, 189,  ' ',  207, 132, 206, 177,  ' ', '2', '2',
    '7',  ' ', 206,  186, 206, 177,  207,  132, 206, 191, 206,  185, 206, 186,
    206,  191, 207,  133, 206, 189,  207,  132, 206, 177, 206,  185, ')', ',',
    ' ',  207, 131,  207, 133, 206,  188,  207, 128, 206, 181,  207, 129, 206,
    185,  206, 187,  206, 177, 206,  188,  206, 178, 206, 177,  206, 189, 206,
    191,  206, 188,  206, 173, 206,  189,  207, 137, 206, 189,  ' ', 207, 132,
    206,  183, 207,  130, ' ', 206,  154,  207, 129, 206, 183,  207, 132, 206,
    183,  207, 130,  ',', ' ', 207,  132,  207, 137, 206, 189,  ' ', 206, 148,
    207,  137, 206,  180, 206, 181,  206,  186, 206, 177, 206,  189, 206, 174,
    207,  131, 207,  137, 206, 189,  ',',  ' ', 207, 132, 207,  137, 206, 189,
    ' ',  206, 154,  207, 133, 206,  186,  206, 187, 206, 172,  206, 180, 207,
    137,  206, 189,  ',', ' ', 207,  132,  207, 137, 206, 189,  ' ', 206, 149,
    207,  128, 207,  132, 206, 177,  206,  189, 206, 174, 207,  131, 207, 137,
    206,  189, ' ',  206, 186, 206,  177,  206, 185, ' ', 207,  128, 206, 191,
    206,  187, 206,  187, 207, 142,  206,  189, ' ', 206, 172,  206, 187, 206,
    187,  207, 137,  206, 189, '.',  206,  164, 206, 191, ' ',  207, 136, 206,
    183,  206, 187,  207, 140, 207,  132,  206, 181, 207, 129,  206, 191, ' ',
    206,  178, 206,  191, 207, 133,  206,  189, 207, 140, ' ',  206, 181, 206,
    175,  206, 189,  206, 177, 206,  185,  ' ', 206, 191, ' ',  206, 140, 206,
    187,  207, 133,  206, 188, 207,  128,  206, 191, 207, 130,  ' ', 206, 186,
    206,  177, 206,  185, ' ', 207,  132,  206, 191, ' ', 206,  188, 206, 181,
    206,  179, 206,  177, 206, 187,  207,  141, 207, 132, 206,  181, 207, 129,
    206,  191, ' ',  207, 128, 206,  191,  207, 132, 206, 172,  206, 188, 206,
    185,  ' ', 206,  191, ' ', 206,  145,  206, 187, 206, 185,  206, 172, 206,
    186,  206, 188,  206, 191, 206,  189,  206, 177, 207, 130,  '.', 13,  10,
    13,   10,  206,  136, 207, 135,  206,  181, 206, 185, ' ',  206, 188, 206,
    177,  206, 186,  207, 129, 206,  172,  ' ', 206, 186, 206,  177, 206, 185,
    ' ',  207, 128,  206, 187, 206,  191,  207, 141, 207, 131,  206, 185, 206,
    177,  ' ', 206,  185, 207, 131,  207,  132, 206, 191, 207,  129, 206, 175,
    206,  177, ' ',  206, 186, 206,  177,  207, 132, 206, 172,  ' ', 207, 132,
    206,  183, 206,  189, ' ', 206,  191,  207, 128, 206, 191,  206, 175, 206,
    177,  ' ', 206,  172, 207, 131,  206,  186, 206, 183, 207,  131, 206, 181,
    ' ',  206, 188,  206, 181, 206,  179,  206, 172, 206, 187,  206, 183, ' ',
    207,  128, 206,  191, 206, 187,  206,  185, 207, 132, 206,  185, 207, 131,
    206,  188, 206,  185, 206, 186,  206,  174, ' ', 206, 181,  207, 128, 206,
    175,  206, 180,  207, 129, 206,  177,  207, 131, 206, 183,  ' ', 207, 131,
    206,  181, ' ',  207, 132, 207,  129,  206, 181, 206, 185,  207, 130, ' ',
    206,  183, 207,  128, 206, 181,  206,  175, 207, 129, 206,  191, 207, 133,
    207,  130, '.',  206, 149, 206,  180,  207, 142, ' ', 206,  179, 206, 181,
    206,  189, 206,  189, 206, 174,  206,  184, 206, 183, 206,  186, 206, 181,
    ' ',  206, 183,  ' ', 206, 180,  206,  183, 206, 188, 206,  191, 206, 186,
    207,  129, 206,  177, 207, 132,  206,  175, 206, 177, ' ',  206, 186, 206,
    177,  206, 185,  ' ', 206, 183,  ' ',  207, 134, 206, 185,  206, 187, 206,
    191,  207, 131,  206, 191, 207,  134,  206, 175, 206, 177,  '.', 206, 145,
    206,  186, 207,  140, 206, 188,  206,  188, 206, 177, ' ',  206, 183, ' ',
    206,  149, 206,  187, 206, 187,  206,  172, 206, 180, 206,  177, ' ', 206,
    181,  206, 175,  206, 189, 206,  177,  206, 185, ' ', 206,  191, ' ', 207,
    132,  207, 140,  207, 128, 206,  191,  207, 130, ' ', 206,  179, 206, 173,
    206,  189, 206,  189, 206, 183,  207,  131, 206, 183, 207,  130, ' ', 207,
    132,  207, 137,  206, 189, ' ',  206,  159, 206, 187, 207,  133, 206, 188,
    207,  128, 206,  185, 206, 177,  206,  186, 207, 142, 206,  189, ' ', 206,
    145,  206, 179,  207, 142, 206,  189,  207, 137, 206, 189,  ',', 207, 132,
    206,  191, 207,  133, ' ', 206,  180,  207, 129, 206, 172,  206, 188, 206,
    177,  207, 132,  206, 191, 207,  130,  ',', ' ', 207, 132,  206, 183, 207,
    130,  ' ', 207,  132, 207, 129,  206,  177, 206, 179, 207,  137, 206, 180,
    206,  175, 206,  177, 207, 130,  ' ',  206, 186, 206, 177,  206, 185, ' ',
    207,  132, 206,  183, 207, 130,  ' ',  206, 186, 207, 137,  206, 188, 206,
    188,  207, 137,  206, 180, 206,  175,  206, 177, 207, 130,  ' ', '.', 13,
    10,   13,  10,   206, 151, ' ',  206,  149, 206, 187, 206,  187, 206, 172,
    206,  180, 206,  177, ' ', 206,  181,  206, 175, 206, 189,  206, 177, 206,
    185,  ' ', 206,  188, 206, 173,  206,  187, 206, 191, 207,  130, ' ', 207,
    132,  207, 137,  206, 189, ' ',  206,  149, 207, 133, 207,  129, 207, 137,
    207,  128, 206,  177, 207, 138,  206,  186, 207, 142, 206,  189, ' ', 206,
    154,  206, 191,  206, 185, 206,  189,  206, 191, 207, 132,  206, 174, 207,
    132,  207, 137,  206, 189, '/',  206,  149, 207, 133, 207,  129, 207, 137,
    207,  128, 206,  177, 207, 138,  206,  186, 206, 174, 207,  130, ' ', 206,
    136,  206, 189,  207, 137, 207,  131,  206, 183, 207, 130,  ' ', 206, 177,
    207,  128, 207,  140, ' ', 207,  132,  206, 191, ' ', '1',  '9', '8', '1',
    ',',  ' ', 207,  132, 206, 183,  207,  130, ' ', 206, 149,  207, 133, 207,
    129,  207, 137,  206, 182, 207,  142,  206, 189, 206, 183,  207, 130, ' ',
    206,  177, 207,  128, 207, 140,  ' ',  207, 132, 206, 191,  ' ', '2', '0',
    '0',  '1', ',',  ' ', 207, 132,  206,  191, 207, 133, ' ',  206, 157, 206,
    145,  206, 164,  206, 159, ' ',  206,  177, 207, 128, 207,  140, ' ', 207,
    132,  206, 191,  ' ', '1', '9',  '5',  '2', ' ', 206, 186,  206, 177, 206,
    185,  ' ', 206,  185, 206, 180,  207,  129, 207, 133, 207,  132, 206, 185,
    206,  186, 207,  140, ' ', 206,  188,  206, 173, 206, 187,  206, 191, 207,
    130,  ' ', 207,  132, 206, 191,  207,  133, ' ', 206, 159,  206, 151, 206,
    149,  ' ', '(',  '1', '9', '4',  '5',  ')', '.', ' ', 206,  151, ' ', 206,
    149,  206, 187,  206, 187, 206,  172,  206, 180, 206, 177,  ' ', 206, 181,
    206,  175, 206,  189, 206, 177,  206,  185, ' ', 206, 188,  206, 185, 206,
    177,  ' ', 206,  177, 206, 189,  206,  181, 207, 128, 207,  132, 207, 133,
    206,  179, 206,  188, 206, 173,  206,  189, 206, 183, ' ',  207, 135, 207,
    142,  207, 129,  206, 177, ' ',  206,  188, 206, 181, ' ',  207, 133, 207,
    136,  206, 183,  206, 187, 207,  140,  ' ', 206, 186, 206,  177, 207, 132,
    206,  172, ' ',  206, 186, 206,  181,  207, 134, 206, 177,  206, 187, 206,
    174,  206, 189,  ' ', 206, 181,  206,  185, 207, 131, 207,  140, 206, 180,
    206,  183, 206,  188, 206, 177,  ' ',  206, 186, 206, 177,  206, 185, ' ',
    207,  128, 206,  191, 206, 187,  207,  141, ' ', 207, 133,  207, 136, 206,
    183,  206, 187,  207, 140, ' ',  206,  180, 206, 181, 206,  175, 206, 186,
    207,  132, 206,  183, ' ', 206,  177,  206, 189, 206, 184,  207, 129, 207,
    142,  207, 128,  206, 185, 206,  189,  206, 183, 207, 130,  ' ', 206, 177,
    206,  189, 206,  172, 207, 128,  207,  132, 207, 133, 206,  190, 206, 183,
    207,  130, '.',  ' ', 206, 154,  206,  177, 207, 132, 206,  173, 207, 135,
    206,  181, 206,  185, ' ', 207,  132,  206, 183, 206, 189,  ' ', '2', '2',
    206,  183, ' ',  206, 186, 206,  177,  206, 187, 207, 141,  207, 132, 206,
    181,  207, 129,  206, 183, ' ',  207,  128, 206, 191, 206,  185, 207, 140,
    207,  132, 206,  183, 207, 132,  206,  177, ' ', 206, 182,  207, 137, 206,
    174,  207, 130,  ' ', 207, 131,  207,  132, 206, 191, 206,  189, ' ', 206,
    186,  207, 140,  207, 131, 206,  188,  206, 191, '.', '[',  '4', ']', 13,
    10,   13,  10,   206, 151, ' ',  206,  149, 206, 187, 206,  187, 206, 172,
    206,  180, 206,  177, ' ', '(',  207,  128, 206, 177, 206,  187, 206, 177,
    206,  185, 207,  140, 207, 132,  206,  181, 207, 129, 206,  177, ':', ' ',
    225,  188, 153,  206, 187, 206,  187,  206, 172, 207, 130,  ',', ' ', 206,
    181,  207, 128,  206, 175, 207,  131,  206, 183, 206, 188,  206, 177, ':',
    ' ',  206, 149,  206, 187, 206,  187,  206, 183, 206, 189,  206, 185, 206,
    186,  206, 174,  ' ', 206, 148,  206,  183, 206, 188, 206,  191, 206, 186,
    207,  129, 206,  177, 207, 132,  206,  175, 206, 177, ')',  ' ', 206, 181,
    206,  175, 206,  189, 206, 177,  206,  185, ' ', 207, 135,  207, 142, 207,
    129,  206, 177,  ' ', 207, 128,  206,  191, 207, 133, ' ',  206, 178, 207,
    129,  206, 175,  207, 131, 206,  186,  206, 181, 207, 132,  206, 177, 206,
    185,  ' ', 207,  131, 207, 132,  206,  183, ' ', 206, 189,  206, 191, 207,
    132,  206, 185,  206, 191, 206,  177,  206, 189, 206, 177,  207, 132, 206,
    191,  206, 187,  206, 185, 206,  186,  206, 174, ' ', 206,  149, 207, 133,
    207,  129, 207,  142, 207, 128,  206,  183, ',', ' ', 207,  131, 207, 132,
    206,  191, ' ',  206, 189, 206,  191,  207, 132, 206, 185,  207, 140, 207,
    132,  206, 181,  207, 129, 206,  191,  ' ', 206, 172, 206,  186, 207, 129,
    206,  191, ' ',  207, 132, 206,  183,  207, 130, ' ', 206,  146, 206, 177,
    206,  187, 206,  186, 206, 177,  206,  189, 206, 185, 206,  186, 206, 174,
    207,  130, ' ',  207, 135, 206,  181,  207, 129, 207, 131,  206, 191, 206,
    189,  206, 174,  207, 131, 206,  191,  207, 133, ',', ' ',  207, 131, 207,
    132,  206, 183,  206, 189, ' ',  206,  145, 206, 189, 206,  177, 207, 132,
    206,  191, 206,  187, 206, 185,  206,  186, 206, 174, ' ',  206, 156, 206,
    181,  207, 131,  207, 140, 206,  179,  206, 181, 206, 185,  206, 191, '.',
    206,  160, 207,  129, 207, 137,  207,  132, 206, 181, 207,  141, 206, 191,
    207,  133, 207,  131, 206, 177,  ' ',  207, 132, 206, 183,  207, 130, ' ',
    206,  149, 206,  187, 206, 187,  206,  172, 206, 180, 206,  191, 207, 130,
    ' ',  206, 186,  206, 177, 206,  185,  ' ', 206, 188, 206,  181, 206, 179,
    206,  177, 206,  187, 207, 141,  207,  132, 206, 181, 207,  129, 206, 183,
    ' ',  207, 128,  207, 140, 206,  187,  206, 183, ' ', 206,  181, 206, 175,
    206,  189, 206,  177, 206, 185,  ' ',  206, 183, ' ', 206,  145, 206, 184,
    206,  174, 206,  189, 206, 177,  '.',  13,  10,  13,  10,   206, 163, 207,
    133,  206, 189,  206, 191, 207,  129,  206, 181, 207, 141,  206, 181, 206,
    185,  ' ', 207,  131, 207, 132,  206,  177, ' ', 206, 178,  206, 191, 207,
    129,  206, 181,  206, 185, 206,  191,  206, 180, 207, 133,  207, 132, 206,
    185,  206, 186,  206, 172, ' ',  206,  188, 206, 181, ' ',  207, 132, 206,
    183,  206, 189,  ' ', 206, 145,  206,  187, 206, 178, 206,  177, 206, 189,
    206,  175, 206,  177, ',', ' ',  207,  131, 207, 132, 206,  177, ' ', 206,
    178,  207, 140,  207, 129, 206,  181,  206, 185, 206, 177,  ' ', 206, 188,
    206,  181, ' ',  207, 132, 206,  183,  ' ', 206, 146, 206,  191, 207, 133,
    206,  187, 206,  179, 206, 177,  207,  129, 206, 175, 206,  177, ' ', 206,
    186,  206, 177,  206, 185, ' ',  207,  132, 206, 183, 206,  189, ' ', 207,
    128,  207, 129,  207, 142, 206,  183,  206, 189, ' ', 206,  147, 206, 185,
    206,  191, 207,  133, 206, 179,  206,  186, 206, 191, 207,  131, 206, 187,
    206,  177, 206,  178, 206, 185,  206,  186, 206, 174, ' ',  206, 148, 206,
    183,  206, 188,  206, 191, 206,  186,  207, 129, 206, 177,  207, 132, 206,
    175,  206, 177,  ' ', 207, 132,  206,  183, 207, 130, ' ',  206, 156, 206,
    177,  206, 186,  206, 181, 206,  180,  206, 191, 206, 189,  206, 175, 206,
    177,  207, 130,  ' ', '(', 207,  128,  '.', 206, 147, '.',  206, 148, '.',
    206,  156, '.',  ')', ' ', 206,  186,  206, 177, 206, 185,  ' ', 207, 131,
    207,  132, 206,  177, ' ', 206,  178,  206, 191, 207, 129,  206, 181, 206,
    185,  206, 191,  206, 177, 206,  189,  206, 177, 207, 132,  206, 191, 206,
    187,  206, 185,  206, 186, 206,  172,  ' ', 206, 188, 206,  181, ' ', 207,
    132,  206, 183,  206, 189, ' ',  206,  164, 206, 191, 207,  133, 207, 129,
    206,  186, 206,  175, 206, 177,  '.',  ' ', 206, 146, 207,  129, 206, 173,
    207,  135, 206,  181, 207, 132,  206,  177, 206, 185, ' ',  207, 131, 207,
    132,  206, 177,  ' ', 206, 177,  206,  189, 206, 177, 207,  132, 206, 191,
    206,  187, 206,  185, 206, 186,  206,  172, ' ', 206, 177,  207, 128, 207,
    140,  ' ', 207,  132, 206, 191,  ' ',  206, 145, 206, 185,  206, 179, 206,
    177,  206, 175,  206, 191, ' ',  206,  160, 206, 173, 206,  187, 206, 177,
    206,  179, 206,  191, 207, 130,  ',',  ' ', 207, 131, 207,  132, 206, 177,
    ' ',  206, 180,  207, 133, 207,  132,  206, 185, 206, 186,  206, 172, ' ',
    206,  177, 207,  128, 207, 140,  ' ',  207, 132, 206, 191,  ' ', 206, 153,
    207,  140, 206,  189, 206, 185,  206,  191, ' ', 206, 186,  206, 177, 206,
    185,  ' ', 206,  189, 207, 140,  207,  132, 206, 185, 206,  177, ' ', 206,
    177,  207, 128,  207, 140, ' ',  207,  132, 206, 183, ' ',  206, 156, 206,
    181,  207, 131,  207, 140, 206,  179,  206, 181, 206, 185,  206, 191, ' ',
    206,  152, 206,  172, 206, 187,  206,  177, 207, 131, 207,  131, 206, 177,
    '.',  206, 151,  ' ', 206, 149,  206,  187, 206, 187, 206,  172, 206, 180,
    206,  177, ' ',  206, 186, 206,  177,  207, 132, 206, 173,  207, 135, 206,
    181,  206, 185,  ' ', 207, 132,  206,  183, 206, 189, ' ',  '1', '1', 206,
    183,  ' ', 206,  184, 206, 173,  207,  131, 206, 183, ' ',  207, 131, 207,
    132,  206, 185,  207, 130, ' ',  207,  135, 207, 142, 207,  129, 206, 181,
    207,  130, ' ',  206, 188, 206,  181,  ' ', 207, 132, 206,  183, ' ', 206,
    188,  206, 181,  206, 179, 206,  177,  206, 187, 207, 141,  207, 132, 206,
    181,  207, 129,  206, 183, ' ',  206,  177, 206, 186, 207,  132, 206, 191,
    206,  179, 207,  129, 206, 177,  206,  188, 206, 188, 206,  174, ' ', 207,
    131,  207, 132,  206, 177, ' ',  '1',  '3', '.', '6', '7',  '6', ' ', 207,
    135,  206, 185,  206, 187, 206,  185,  207, 140, 206, 188,  206, 181, 207,
    132,  207, 129,  206, 177, ' ',  206,  186, 206, 177, 206,  184, 207, 142,
    207,  130, ' ',  206, 181, 207,  135,  206, 181, 206, 185,  ' ', 207, 128,
    206,  191, 206,  187, 206, 187,  206,  172, ' ', 206, 189,  206, 183, 207,
    131,  206, 185,  206, 172, ' ',  '(',  207, 128, 206, 181,  207, 129, 206,
    175,  207, 128,  206, 191, 207,  133,  ' ', '1', '.', '4',  '0', '0', ',',
    ' ',  206, 181,  206, 186, 207,  132,  207, 137, 206, 189,  ' ', 206, 191,
    207,  128, 206,  191, 206, 175,  207,  137, 206, 189, ' ',  207, 132, 206,
    177,  ' ', '2',  '2', '7', ' ',  206,  186, 206, 177, 207,  132, 206, 191,
    206,  185, 206,  186, 206, 191,  207,  133, 206, 189, 207,  132, 206, 177,
    206,  185, ')',  ',', ' ', 207,  131,  207, 133, 206, 188,  207, 128, 206,
    181,  207, 129,  206, 185, 206,  187,  206, 177, 206, 188,  206, 178, 206,
    177,  206, 189,  206, 191, 206,  188,  206, 173, 206, 189,  207, 137, 206,
    189,  ' ', 207,  132, 206, 183,  207,  130, ' ', 206, 154,  207, 129, 206,
    183,  207, 132,  206, 183, 207,  130,  ',', ' ', 207, 132,  207, 137, 206,
    189,  ' ', 206,  148, 207, 137,  206,  180, 206, 181, 206,  186, 206, 177,
    206,  189, 206,  174, 207, 131,  207,  137, 206, 189, ',',  ' ', 207, 132,
    207,  137, 206,  189, ' ', 206,  154,  207, 133, 206, 186,  206, 187, 206,
    172,  206, 180,  207, 137, 206,  189,  ',', ' ', 207, 132,  207, 137, 206,
    189,  ' ', 206,  149, 207, 128,  207,  132, 206, 177, 206,  189, 206, 174,
    207,  131, 207,  137, 206, 189,  ' ',  206, 186, 206, 177,  206, 185, ' ',
    207,  128, 206,  191, 206, 187,  206,  187, 207, 142, 206,  189, ' ', 206,
    172,  206, 187,  206, 187, 207,  137,  206, 189, '.', 206,  164, 206, 191,
    ' ',  207, 136,  206, 183, 206,  187,  207, 140, 207, 132,  206, 181, 207,
    129,  206, 191,  ' ', 206, 178,  206,  191, 207, 133, 206,  189, 207, 140,
    ' ',  206, 181,  206, 175, 206,  189,  206, 177, 206, 185,  ' ', 206, 191,
    ' ',  206, 140,  206, 187, 207,  133,  206, 188, 207, 128,  206, 191, 207,
    130,  ' ', 206,  186, 206, 177,  206,  185, ' ', 207, 132,  206, 191, ' ',
    206,  188, 206,  181, 206, 179,  206,  177, 206, 187, 207,  141, 207, 132,
    206,  181, 207,  129, 206, 191,  ' ',  207, 128, 206, 191,  207, 132, 206,
    172,  206, 188,  206, 185, ' ',  206,  191, ' ', 206, 145,  206, 187, 206,
    185,  206, 172,  206, 186, 206,  188,  206, 191, 206, 189,  206, 177, 207,
    130,  '.', 13,   10,  13,  10,   206,  136, 207, 135, 206,  181, 206, 185,
    ' ',  206, 188,  206, 177, 206,  186,  207, 129, 206, 172,  ' ', 206, 186,
    206,  177, 206,  185, ' ', 207,  128,  206, 187, 206, 191,  207, 141, 207,
    131,  206, 185,  206, 177, ' ',  206,  185, 207, 131, 207,  132, 206, 191,
    207,  129, 206,  175, 206, 177,  ' ',  206, 186, 206, 177,  207, 132, 206,
    172,  ' ', 207,  132, 206, 183,  206,  189, ' ', 206, 191,  207, 128, 206,
    191,  206, 175,  206, 177, ' ',  206,  172, 207, 131, 206,  186, 206, 183,
    207,  131, 206,  181, ' ', 206,  188,  206, 181, 206, 179,  206, 172, 206,
    187,  206, 183,  ' ', 207, 128,  206,  191, 206, 187, 206,  185, 207, 132,
    206,  185, 207,  131, 206, 188,  206,  185, 206, 186, 206,  174, ' ', 206,
    181,  207, 128,  206, 175, 206,  180,  207, 129, 206, 177,  207, 131, 206,
    183,  ' ', 207,  131, 206, 181,  ' ',  207, 132, 207, 129,  206, 181, 206,
    185,  207, 130,  ' ', 206, 183,  207,  128, 206, 181, 206,  175, 207, 129,
    206,  191, 207,  133, 207, 130,  '.',  206, 149, 206, 180,  207, 142, ' ',
    206,  179, 206,  181, 206, 189,  206,  189, 206, 174, 206,  184, 206, 183,
    206,  186, 206,  181, ' ', 206,  183,  ' ', 206, 180, 206,  183, 206, 188,
    206,  191, 206,  186, 207, 129,  206,  177, 207, 132, 206,  175, 206, 177,
    ' ',  206, 186,  206, 177, 206,  185,  ' ', 206, 183, ' ',  207, 134, 206,
    185,  206, 187,  206, 191, 207,  131,  206, 191, 207, 134,  206, 175, 206,
    177,  '.', 206,  145, 206, 186,  207,  140, 206, 188, 206,  188, 206, 177,
    ' ',  206, 183,  ' ', 206, 149,  206,  187, 206, 187, 206,  172, 206, 180,
    206,  177, ' ',  206, 181, 206,  175,  206, 189, 206, 177,  206, 185, ' ',
    206,  191, ' ',  207, 132, 207,  140,  207, 128, 206, 191,  207, 130, ' ',
    206,  179, 206,  173, 206, 189,  206,  189, 206, 183, 207,  131, 206, 183,
    207,  130, ' ',  207, 132, 207,  137,  206, 189, ' ', 206,  159, 206, 187,
    207,  133, 206,  188, 207, 128,  206,  185, 206, 177, 206,  186, 207, 142,
    206,  189, ' ',  206, 145, 206,  179,  207, 142, 206, 189,  207, 137, 206,
    189,  ',', 207,  132, 206, 191,  207,  133, ' ', 206, 180,  207, 129, 206,
    172,  206, 188,  206, 177, 207,  132,  206, 191, 207, 130,  ',', ' ', 207,
    132,  206, 183,  207, 130, ' ',  207,  132, 207, 129, 206,  177, 206, 179,
    207,  137, 206,  180, 206, 175,  206,  177, 207, 130, ' ',  206, 186, 206,
    177,  206, 185,  ' ', 207, 132,  206,  183, 207, 130, ' ',  206, 186, 207,
    137,  206, 188,  206, 188, 207,  137,  206, 180, 206, 175,  206, 177, 207,
    130,  ' ', '.',  13,  10,  13,   10,   206, 151, ' ', 206,  149, 206, 187,
    206,  187, 206,  172, 206, 180,  206,  177, ' ', 206, 181,  206, 175, 206,
    189,  206, 177,  206, 185, ' ',  206,  188, 206, 173, 206,  187, 206, 191,
    207,  130, ' ',  207, 132, 207,  137,  206, 189, ' ', 206,  149, 207, 133,
    207,  129, 207,  137, 207, 128,  206,  177, 207, 138, 206,  186, 207, 142,
    206,  189, ' ',  206, 154, 206,  191,  206, 185, 206, 189,  206, 191, 207,
    132,  206, 174,  207, 132, 207,  137,  206, 189, '/', 206,  149, 207, 133,
    207,  129, 207,  137, 207, 128,  206,  177, 207, 138, 206,  186, 206, 174,
    207,  130, ' ',  206, 136, 206,  189,  207, 137, 207, 131,  206, 183, 207,
    130,  ' ', 206,  177, 207, 128,  207,  140, ' ', 207, 132,  206, 191, ' ',
    '1',  '9', '8',  '1', ',', ' ',  207,  132, 206, 183, 207,  130, ' ', 206,
    149,  207, 133,  207, 129, 207,  137,  206, 182, 207, 142,  206, 189, 206,
    183,  207, 130,  ' ', 206, 177,  207,  128, 207, 140, ' ',  207, 132, 206,
    191,  ' ', '2',  '0', '0', '1',  ',',  ' ', 207, 132, 206,  191, 207, 133,
    ' ',  206, 157,  206, 145, 206,  164,  206, 159, ' ', 206,  177, 207, 128,
    207,  140, ' ',  207, 132, 206,  191,  ' ', '1', '9', '5',  '2', ' ', 206,
    186,  206, 177,  206, 185, ' ',  206,  185, 206, 180, 207,  129, 207, 133,
    207,  132, 206,  185, 206, 186,  207,  140, ' ', 206, 188,  206, 173, 206,
    187,  206, 191,  207, 130, ' ',  207,  132, 206, 191, 207,  133, ' ', 206,
    159,  206, 151,  206, 149, ' ',  '(',  '1', '9', '4', '5',  ')', '.', ' ',
    206,  151, ' ',  206, 149, 206,  187,  206, 187, 206, 172,  206, 180, 206,
    177,  ' ', 206,  181, 206, 175,  206,  189, 206, 177, 206,  185, ' ', 206,
    188,  206, 185,  206, 177, ' ',  206,  177, 206, 189, 206,  181, 207, 128,
    207,  132, 207,  133, 206, 179,  206,  188, 206, 173, 206,  189, 206, 183,
    ' ',  207, 135,  207, 142, 207,  129,  206, 177, ' ', 206,  188, 206, 181,
    ' ',  207, 133,  207, 136, 206,  183,  206, 187, 207, 140,  ' ', 206, 186,
    206,  177, 207,  132, 206, 172,  ' ',  206, 186, 206, 181,  207, 134, 206,
    177,  206, 187,  206, 174, 206,  189,  ' ', 206, 181, 206,  185, 207, 131,
    207,  140, 206,  180, 206, 183,  206,  188, 206, 177, ' ',  206, 186, 206,
    177,  206, 185,  ' ', 207, 128,  206,  191, 206, 187, 207,  141, ' ', 207,
    133,  207, 136,  206, 183, 206,  187,  207, 140, ' ', 206,  180, 206, 181,
    206,  175, 206,  186, 207, 132,  206,  183, ' ', 206, 177,  206, 189, 206,
    184,  207, 129,  207, 142, 207,  128,  206, 185, 206, 189,  206, 183, 207,
    130,  ' ', 206,  177, 206, 189,  206,  172, 207, 128, 207,  132, 207, 133,
    206,  190, 206,  183, 207, 130,  '.',  ' ', 206, 154, 206,  177, 207, 132,
    206,  173, 207,  135, 206, 181,  206,  185, ' ', 207, 132,  206, 183, 206,
    189,  ' ', '2',  '2', 206, 183,  ' ',  206, 186, 206, 177,  206, 187, 207,
    141,  207, 132,  206, 181, 207,  129,  206, 183, ' ', 207,  128, 206, 191,
    206,  185, 207,  140, 207, 132,  206,  183, 207, 132, 206,  177, ' ', 206,
    182,  207, 137,  206, 174, 207,  130,  ' ', 207, 131, 207,  132, 206, 191,
    206,  189, ' ',  206, 186, 207,  140,  207, 131, 206, 188,  206, 191, '.',
    '[',  '4', ']',  13,  10,  13,   10,   'R', 'a', 'n', 'd',  'o', 'm', ' ',
    'Q',  'u', 'a',  'd', ' ', 'V',  'a',  'l', 'u', 'e', 's',  13,  10,  240,
    144,  128, 128,  240, 152, 166,  171,  240, 158, 187, 174,  240, 154, 170,
    170,  240, 154,  132, 163, 240,  155,  132, 163, 243, 187,  174, 187, 244,
    128,  128, 128,  243, 174, 187,  174,  242, 187, 174, 187,  13,  10,  0
};

static
const char * const charUtf8MultiLang = (const char *) utf8MultiLang;

enum { NUM_UTF8_MULTI_LANG_CODE_POINTS = 11781,
       UTF8_MULTI_LANG_STR_LEN = sizeof(utf8MultiLang) - 1 };

/// Random number generator using the high-order 32 bits of Donald Knuth's
/// MMIX algorithm.
class RandGen {

    bsls::Types::Uint64 d_seed;

  public:
    // CREATOR

    /// Initialize the generator with the optionally specified `startSeed`.
    explicit
    RandGen(int startSeed = 0);

    // MANIPULATORS

    /// Return the next random number in the series;
    unsigned operator()();

    /// Return a random `char`.
    char getChar();
};

// CREATOR
inline
RandGen::RandGen(int startSeed)
: d_seed(startSeed)
{
    (void) (*this)();
    (void) (*this)();
    (void) (*this)();
}

// MANIPULATOR
inline
unsigned RandGen::operator()()
{
    d_seed = d_seed * 6364136223846793005ULL + 1442695040888963407ULL;
    return static_cast<unsigned>(d_seed >> 32);
}

inline
char RandGen::getChar()
{
    return static_cast<char>((*this)() & 0xff);
}

static
RandGen rg;

/// Append a random 1-byte UTF-8 character to the specified `*dst`.
static
void appendRand1Byte(bsl::string *dst)
{
    enum {
        k_LOW_BOUND  =    1,
        k_HIGH_BOUND = 0x7f,
        k_MOD_BY     = k_HIGH_BOUND + 1 - k_LOW_BOUND };

    unsigned val = rg() % k_MOD_BY + k_LOW_BOUND;

    BSLS_ASSERT(val <= k_HIGH_BOUND);

    unsigned char buf[2];
    buf[0] = static_cast<unsigned char>(val);
    buf[1] = 0;

    *dst += reinterpret_cast<const char *>(&buf[0]);
}

/// Append a random 2-byte UTF-8 character to the specified `*dst`.
static
void appendRand2Byte(bsl::string *dst)
{
    enum {
        k_LOW_BOUND  =  0x80,
        k_HIGH_BOUND = 0x7ff,
        k_MOD_BY     = k_HIGH_BOUND + 1 - k_LOW_BOUND };

    unsigned val = rg() % k_MOD_BY + k_LOW_BOUND;

    BSLS_ASSERT(val <= k_HIGH_BOUND);

    unsigned char buf[3];
    buf[0] = static_cast<unsigned char>(((val & 0x7c0) >> 6) | 0xc0);
    buf[1] = static_cast<unsigned char> ((val &  0x3f)       | 0x80);
    buf[2] = 0;

    *dst += reinterpret_cast<const char *>(&buf[0]);
}

/// Append a random 3-byte UTF-8 character to the specified `*dst`.
static
void appendRand3Byte(bsl::string *dst)
{
    enum {
        k_LOW_BOUND  =  0x800,
        k_HIGH_BOUND = 0xffff,
        k_MOD_BY     = k_HIGH_BOUND + 1 - k_LOW_BOUND };

    unsigned val;
    do {
        if (veryVerbose) P("trace to satiate bde verify");

        val = rg() % k_MOD_BY + k_LOW_BOUND;
    } while (val >= 0xd800 && val <= 0xdfff);    // skip surrogates

    BSLS_ASSERT(val <= k_HIGH_BOUND);

    unsigned char buf[4];
    buf[0] = static_cast<unsigned char>(((val & 0xf000) >> 12) | 0xe0);
    buf[1] = static_cast<unsigned char>(((val &  0xfc0) >>  6) | 0x80);
    buf[2] = static_cast<unsigned char> ((val &   0x3f)        | 0x80);
    buf[3] = 0;

    *dst += reinterpret_cast<const char *>(&buf[0]);
}

/// Append a random 4-byte UTF-8 character to the specified `*dst`.
static
void appendRand4Byte(bsl::string *dst)
{
    enum {
        k_LOW_BOUND  =  0x10000,
        k_HIGH_BOUND = 0x10ffff,
        k_MOD_BY     = k_HIGH_BOUND + 1 - k_LOW_BOUND };

    unsigned val = rg() % k_MOD_BY + k_LOW_BOUND;

    BSLS_ASSERT(val <= k_HIGH_BOUND);

    unsigned char buf[5];
    buf[0] = static_cast<unsigned char>(((val & 0x1c0000) >> 18) | 0xf0);
    buf[1] = static_cast<unsigned char>(((val &  0x3f000) >> 12) | 0x80);
    buf[2] = static_cast<unsigned char>(((val &    0xfc0) >>  6) | 0x80);
    buf[3] = static_cast<unsigned char> ((val &     0x3f)        | 0x80);
    buf[4] = 0;

    *dst += reinterpret_cast<const char *>(&buf[0]);
}

/// Append a random valid UTF-8 character to the specified `*dst`.  The '\0'
/// byte is only possible if the specified `useZero` is `true`.  Optionally
/// specify h `numBytes`.  If `0 == numBytes` append a '\0', otherwise
/// `numBytes` is the length in bytes of the random sequence to be appended.
/// If `numBytes` is not specified, a random value in the range `[ 1 .. 4 ]`
/// will be used.  The behavior is undefined if a value of `numBytes`
/// outside the range `[ 1 .. 4 ]` is specified.
static
void appendRandCorrectCodePoint(bsl::string *dst,
                                bool         useZero,
                                int          numBytes = -1)
{
    unsigned r;
    if (-1 == numBytes) {
        r = rg();
        r = useZero ? r % 5
                    : (r & 3) + 1;
    }
    else {
        BSLS_ASSERT(0 <= numBytes && numBytes <= 4);

        r = useZero && 1 == numBytes && 0 == rg() % 5 ? 0 : numBytes;
    }

    switch (r) {
      case 0: {
        dst->push_back('\0');
      } break;
      case 1: {
        appendRand1Byte(dst);
      } break;
      case 2: {
        appendRand2Byte(dst);
      } break;
      case 3: {
        appendRand3Byte(dst);
      } break;
      case 4: {
        appendRand4Byte(dst);
      } break;
      default: {
        ASSERT(0);
      }
    }
}

/// Given the specified `firstChar`, which is the first character of a UTF-8
/// sequence, return the length in bytes of the sequence.  If `firstChar` is
/// not a valid beginning of a UTF-8 sequence, return a negative value.
int codePointSize(char firstChar)
{
    if ((0xf8 & firstChar) == 0xf0) {
        return 4;                                                     // RETURN
    }
    if ((0xf0 & firstChar) == 0xe0) {
        return 3;                                                     // RETURN
    }
    if ((0xe0 & firstChar) == 0xc0) {
        return 2;                                                     // RETURN
    }
    if ((0x80 & firstChar) ==    0) {
        return 1;                                                     // RETURN
    }

    return -1;
}

/// Returns the specified `str` in a human-readable hex format.
bsl::string dumpStr(const bsl::string& str)
{
    bsl::string ret;

    const char *begin = str.c_str();
    const char *end   = &*str.end();

    for (const char *pc = begin; pc < end; ++pc) {
        if (begin != pc) {
            ret.push_back(' ');
        }

        for (int shiftDown = 4; shiftDown >= 0; shiftDown -= 4) {
            int digit = (*pc >> shiftDown) & 0xf;
            ret.push_back(digit < 10 ? char('0' + digit)
                                     : char('a' + digit - 10));
        }
    }

    return ret;
}

/// Return the length of the specified `str`, as an `int`.
inline
int intStrLen(const char *str)
{
    return static_cast<int>(bsl::strlen(str));
}

const Util::ErrorStatus EIT = Util::k_END_OF_INPUT_TRUNCATION;
const Util::ErrorStatus UCO = Util::k_UNEXPECTED_CONTINUATION_OCTET;
const Util::ErrorStatus NCO = Util::k_NON_CONTINUATION_OCTET;
const Util::ErrorStatus OLE = Util::k_OVERLONG_ENCODING;
const Util::ErrorStatus IIO = Util::k_INVALID_INITIAL_OCTET;
const Util::ErrorStatus VTL = Util::k_VALUE_LARGER_THAN_0X10FFFF;
const Util::ErrorStatus SUR = Util::k_SURROGATE;

static const struct Data {
    int         d_lineNum;    // source line number

    const char *d_utf8_p;     // UTF-8 input string

    int         d_numCodePoints;
                              // number of UTF-8 code points (-1 if invalid)

    int         d_errOffset;  // byte offset to first invalid sequence;
                              // -1 if valid
} DATA[] = {
    //L#  input                            #c  eo
    //--  -----                           ---  --
    // unexpected continuation octets

    { L_, "\x80",                         UCO,  0 },
    { L_, "\x85p",                        UCO,  0 },
    { L_, "a\x85",                        UCO,  1 },
    { L_, "\x90",                         UCO,  0 },
    { L_, " \x91",                        UCO,  1 },
    { L_, "\x9a",                         UCO,  0 },
    { L_, " \x9f",                        UCO,  1 },
    { L_, " \xa0",                        UCO,  1 },
    { L_, "\xa1",                         UCO,  0 },
    { L_, "7\xaa",                        UCO,  1 },
    { L_, "\xaf",                         UCO,  0 },
    { L_, " \xb0",                        UCO,  1 },
    { L_, "\xb1",                         UCO,  0 },
    { L_, "\xba",                         UCO,  0 },
    { L_, "p\xbf",                        UCO,  1 },

    // Make sure partial 4-octet code points are handled correctly (with a
    // single error).

    { L_, "\xf0",                         EIT,  0 },
    { L_, "\xf0\x80",                     EIT,  0 },
    { L_, "\xf0\x80\x80",                 EIT,  0 },
    { L_, "\xf0 ",                        NCO,  0 },
    { L_, "\xf0\x80 ",                    NCO,  0 },
    { L_, "\xf0\x80\x80 ",                NCO,  0 },

    // Make sure partial 4-octet code points are handled correctly (with a
    // single error).

    { L_, "\xe0\x80",                     EIT,  0 },
    { L_, "\xe0",                         EIT,  0 },
    { L_, "\xe0\x80 ",                    NCO,  0 },
    { L_, "\xe0 ",                        NCO,  0 },

    // Make sure the "illegal" UTF-8 octets are handled correctly:
    //   o The octet values C0, C1, F5 to FF never appear.

    { L_, "\xc0",                         EIT,  0 },
    { L_, "\xc1",                         EIT,  0 },
    { L_, "\xf0",                         EIT,  0 },
    { L_, "\xf5",                         EIT,  0 },
    { L_, "\xf6",                         EIT,  0 },
    { L_, "\xf7",                         EIT,  0 },
    { L_, "\xf8",                         IIO,  0 },
    { L_, "\xf8\xaf\xaf\xaf",             IIO,  0 },
    { L_, "\xf8\x80\x80\x80",             IIO,  0 },
    { L_, "\xf8",                         IIO,  0 },
    { L_, "\xf9",                         IIO,  0 },
    { L_, "\xfa",                         IIO,  0 },
    { L_, "\xfb",                         IIO,  0 },
    { L_, "\xfc",                         IIO,  0 },
    { L_, "\xfd",                         IIO,  0 },
    { L_, "\xfe",                         IIO,  0 },
    { L_, "\xff",                         IIO,  0 },

    // Make sure that the "illegal" UTF-8 octets are handled correctly
    // mid-string:
    //   o The octet values C0, C1, F5 to FF never appear.

    { L_, " \xc0 ",                       NCO,  1 },
    { L_, " \xc1 ",                       NCO,  1 },
    { L_, " \xf5 ",                       NCO,  1 },
    { L_, " \xf6 ",                       NCO,  1 },
    { L_, " \xf7 ",                       NCO,  1 },
    { L_, " \xf8 ",                       IIO,  1 },
    { L_, " \xf9 ",                       IIO,  1 },
    { L_, " \xfa ",                       IIO,  1 },
    { L_, " \xfb ",                       IIO,  1 },
    { L_, " \xfc ",                       IIO,  1 },
    { L_, " \xfd ",                       IIO,  1 },
    { L_, " \xfe ",                       IIO,  1 },
    { L_, " \xff ",                       IIO,  1 },

    { L_, "\xc2",                         EIT,  0 },

    { L_, "\x01\x20\x7f\xc3\xbf\xdf\xbf\xe0\xa0\x80\xef",
                                          EIT, 10 },

    { L_, "\x01\x20\x7f\xc3\xbf\xdf\xbf\xe0\xa0\x80\xef\xbf",
                                          EIT, 10 },

    // Make sure illegal overlong encodings are not accepted.  These code
    // points are mathematically correctly encoded, but since there are
    // equivalent encodings with fewer octets, the UTF-8 standard disallows
    // them.

    { L_, "\xf0\x80\x80\x80",             OLE,  0 },
    { L_, "\xf0\x8a\xaa\xaa",             OLE,  0 },
    { L_, "\xf0\x8f\xbf\xbf",             OLE,  0 },    // max OLE
    { L_, "\xf4\x90\x80\x80",             VTL,  0 },    // min VTL
    { L_, "\xf4\x90\xbf\xbf",             VTL,  0 },    //     VTL
    { L_, "\xf4\xa0\x80\x80",             VTL,  0 },    //     VTL
    { L_, "\xf7\xbf\xbf\xbf",             VTL,  0 },    // max VTL

    { L_, "\xe0\x80\x80",                 OLE,  0 },
    { L_, "\xe0\x9a\xaa",                 OLE,  0 },
    { L_, "\xe0\x9f\xbf",                 OLE,  0 },    // max OLE

    { L_, "\xc0\x80",                     OLE,  0 },
    { L_, "\xc0\xaa",                     OLE,  0 },
    { L_, "\xc0\xbf",                     OLE,  0 },
    { L_, "\xc1\x81",                     OLE,  0 },
    { L_, "\xc1\xbf",                     OLE,  0 },    // max OLE

    // Corrupted 2-octet code point:

    { L_, "\xc2",                         EIT,  0 },
    { L_, " \xc2",                        EIT,  1 },
    { L_, "\xc2 ",                        NCO,  0 },
    { L_, "\xc2\xc2",                     NCO,  0 },
    { L_, "\xc2\xef",                     NCO,  0 },

    // Corrupted 2-octet code point followed by an invalid code point:

    { L_, "\xc2\xff",                     NCO,  0 },
    { L_, "\xc2\xff",                     NCO,  0 },

    // 3-octet code points corrupted after octet 1:

    { L_, "\xef",                         EIT,  0 },
    { L_, " \xef",                        EIT,  1 },
    { L_, "\xef ",                        NCO,  0 },
    { L_, "\xef\xef ",                    NCO,  0 },
    { L_, "\xef \xef",                    NCO,  0 },
    { L_, "\xef" "\xc2\x80",              NCO,  0 },

    // 3-octet code points corrupted after octet 2:

    { L_, "\xef\xbf",                     EIT,  0 },
    { L_, "\xef\xbf",                     EIT,  0 },
    { L_, " \xef\xbf@",                   NCO,  1 },
    { L_, " \xef\xbf@",                   NCO,  1 },
    { L_, "\xef\xbf ",                    NCO,  0 },
    { L_, "\xef\xbf ",                    NCO,  0 },
    { L_, "\xef\xbf\xef",                 NCO,  0 },

    { L_, "\xed\xa0\x80",                 SUR,  0 },
    { L_, "\xed\xb0\x85 ",                SUR,  0 },
    { L_, "\xed\xbf\xbf",                 SUR,  0 },
};
enum { NUM_DATA = sizeof DATA / sizeof *DATA };

void brokenGlassTest(const u::Data&     data,
                     const bsl::string& validStr,
                     bool               seekFirst,
                     bool               appendValid)
    // ------------------------------------------------------------------------
    // UTF-8 BROKEN GLASS TEST
    //
    // Use the specified `data`, which is a record from the `u::DATA` table
    // above of incorrect UTF-8 strings and what type of UTF-8 error occurs in
    // the string.  The specified `validStr` is to preceed the incorrect UTF-8
    // sequence in the `streambuf`.  If the specified `seekFirst` is `true`,
    // seek past the `validStr` part of the `streambuf` before beginning input.
    // If the specified `appendValid` is `true` append valid UTF-8 after the
    // incorrect UTF-8.  Note that if `appendValid` is `true` and the expected
    // error is of type `end of input truncation`, we change the expected error
    // to `non continuation offset`.
    //
    // Concern:
    // 1. That the object under test correctly detects and diagnoses UTF-8
    //    errors.
    //
    // 2. After reaching a UTF-8 error,
    //    - The `errorStatus()` accessor returns the `enum` properly identifies
    //      the nature of the UTF-8 error.
    //
    //    - The `pubseekoff(0, bsl::ios_base::cur)` accessor correctly
    //      identifies the offset of the beginning of the incorrect UTF-8
    //      sequence.
    //
    // Plan:
    // 1. Create a random valid UTF-8 string containing 0 to 3 code points.
    //
    // 2. Append an incorrect UTF-8 sequence to it.
    //
    // 3. Create a wrapped `streambuf` around that string.
    //
    // 4. Read the string until input is exhausted in 3 ways:
    //    - in one large `sgetn` call
    //
    //    - in multiple `sgetn` calls, a few bytes at a time
    //
    //    - with calls to `sbumpc`
    //
    // 5. Observe that:
    //    - all of the valid utf8 prior to the incorrect UTF-8 sequence is read
    //
    //    - `errorStatus()` correctly identifies the nature of the UTF-8 error
    //
    //    - `pubseekoff(0, bsl::ios_base::cur)` correctly identifies the offset
    //      in the streambuf where the UTF-8 error occurs.
    //
    // 6. Repeat all of the above, with valid UTF-8 appended after the invalid
    //    code point.  If the expected error code was
    //    `end of input truncation`, substitute `non continuation offset`.
    //
    // 7. Repeat all the above, seeking first past the valid UTF-8 before the
    //    bad UTF-8 begins, and beginning reading from there.  Of particular
    //    interest in that case is whether `pubseekoff(0, bsl::ios_base::cur)`
    //    gives the correct offset.
    //
    // Testing:
    //   BROKEN GLASS TEST
    // ------------------------------------------------------------------------
{
    const int   LINE       = data.d_lineNum;
    const char *ERR_UTF8   = data.d_utf8_p;
    const int   errType    = data.d_numCodePoints;
    const int   ERR_TYPE   = errType;
    const int   ERR_OFFSET = data.d_errOffset;

    appendValid &= u::EIT != ERR_TYPE;

    static u::RandGen rand;

    ASSERTV(LINE, ERR_TYPE, ERR_TYPE < 0);

    bsl::string utf8(validStr);    const bsl::string& UTF8 = utf8;
    utf8 += ERR_UTF8;

    bsl::string preamble(seekFirst ? bsl::string() : validStr);
    preamble.append(ERR_UTF8, ERR_OFFSET);
    const bsl::string& PREAMBLE = preamble;

    if (appendValid) {
        for (unsigned uu = rand() % 3 + 1; 0 < uu--; ) {
            if (veryVerbose) P("trace to satiate bde verify");

            u::appendRandCorrectCodePoint(&utf8, false);
        }
    }

    const OT UTF8_ERR_OFFSET = validStr.length() + ERR_OFFSET;
    const PT UTF8_ERR_PT(UTF8_ERR_OFFSET);
    char buf[1024];
    ASSERT(UTF8.length() < sizeof(buf));

    if (veryVeryVeryVerbose) cout << "One big `sgetn`\n";
    {
        FSB fsb(UTF8.c_str(), UTF8.length());

        PT pre = 0;
        if (seekFirst) {
            pre = validStr.length();
            ASSERT(fsb.pubseekpos(pre) == PT(pre));
        }

        Obj sb;    Obj& SB = sb;
        sb.reset(&fsb);

        const OT sz = sb.sgetn(buf, sizeof(buf));
        buf[sz] = 0;
        ASSERTV(LINE, u::dumpStr(UTF8), UTF8_ERR_OFFSET, sz,
                                 u::dumpStr(buf), UTF8_ERR_OFFSET == pre + sz);
        ASSERTV(LINE, seekFirst, validStr.length(),
                                          sb.pubseekoff(0, bsl::ios_base::cur),
                                         UTF8_ERR_OFFSET, u::dumpStr(PREAMBLE),
                          UTF8_ERR_PT == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERTV(LINE, u::dumpStr(UTF8), Obj::toAscii(SB.errorStatus()),
                                                         SB.errorStatus() < 0);
        ASSERTV(LINE, appendValid, Obj::toAscii(ERR_TYPE),
                 Obj::toAscii(SB.errorStatus()), ERR_TYPE == SB.errorStatus());
        ASSERT(Util::isValid(buf));
        ASSERTV(LINE, u::dumpStr(UTF8), seekFirst, appendValid, PREAMBLE, buf,
                                                              PREAMBLE == buf);

        ASSERT(ptZero == sb.pubseekpos(0));
        ASSERTV(UTF8_ERR_OFFSET,
                        Obj::toAscii(ERR_TYPE), Obj::toAscii(SB.errorStatus()),
                         (UTF8_ERR_OFFSET ? 0 : ERR_TYPE) == SB.errorStatus());
    }

    if (veryVeryVeryVerbose) cout << "Multiple `sgetn`s\n";
    {
        FSB fsb(UTF8.c_str(), UTF8.length());

        PT pre = 0;
        if (seekFirst) {
            pre = validStr.length();
            ASSERT(fsb.pubseekpos(pre) == PT(pre));
        }

        Obj sb;    Obj& SB = sb;
        sb.reset(&fsb);

        OT totSz = 0, sz;

        // read chunks of random size in the range `[ 1 .. 3 ]`

        while (0 < (sz = sb.sgetn(buf + totSz, rand() % 3 + 1))){
            if (veryVeryVeryVeryVerbose) P("trace to satiate bde verify");

            totSz += sz;
        }
        buf[totSz] = 0;
        ASSERTV(LINE, u::dumpStr(UTF8), UTF8_ERR_OFFSET, totSz,
                              u::dumpStr(buf), UTF8_ERR_OFFSET == pre + totSz);
        ASSERTV(LINE, seekFirst, validStr.length(),
                                          sb.pubseekoff(0, bsl::ios_base::cur),
                                         UTF8_ERR_OFFSET, u::dumpStr(PREAMBLE),
                          UTF8_ERR_PT == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERTV(LINE, u::dumpStr(UTF8), Obj::toAscii(SB.errorStatus()),
                                                         SB.errorStatus() < 0);
        ASSERT(ERR_TYPE == SB.errorStatus());
        ASSERT(Util::isValid(buf));
        ASSERT(PREAMBLE == buf);

        ASSERT(ptZero == sb.pubseekpos(0));
        if (UTF8_ERR_OFFSET) {
            ASSERT(0 == SB.errorStatus());
            ASSERT(1 == sb.sgetn(buf, 1));
            ASSERT(0 == SB.errorStatus());
        }
        else {
            ASSERT(ERR_TYPE == SB.errorStatus());
            ASSERT(0 == sb.sgetn(buf, 1));
            ASSERT(ERR_TYPE == SB.errorStatus());
        }
    }

    if (veryVeryVeryVerbose) cout << "`sbumpc`s\n";
    {
        FSB fsb(UTF8.c_str(), UTF8.length());

        PT pre = 0;
        if (seekFirst) {
            pre = validStr.length();
            ASSERT(fsb.pubseekpos(pre) == PT(pre));
        }

        Obj sb;    Obj& SB = sb;
        sb.reset(&fsb);

        bsl::memset(buf, 0, sizeof(buf));
        char *pc = buf;
        int c;
        while (Obj::traits_type::eof() != (c = sb.sbumpc())) {
            if (veryVeryVeryVeryVerbose) P("trace to satiate bde verify");

            *pc++ = static_cast<char>(c);
        }
        *pc = 0;
        ASSERTV(LINE, u::dumpStr(UTF8), UTF8_ERR_OFFSET, pc - buf,
                           u::dumpStr(buf), UTF8_ERR_OFFSET == pre + pc - buf);
        ASSERT(UTF8_ERR_PT == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERTV(LINE, u::dumpStr(UTF8), Obj::toAscii(SB.errorStatus()),
                                                         SB.errorStatus() < 0);
        ASSERT(ERR_TYPE == SB.errorStatus());
        ASSERT(Util::isValid(buf));
        ASSERT(PREAMBLE == buf);

        ASSERT(ptZero == sb.pubseekpos(0));
        if (UTF8_ERR_OFFSET) {
            ASSERTV(UTF8_ERR_OFFSET, Obj::toAscii(ERR_TYPE),
                                                Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
            ASSERT(1 == sb.sgetn(buf, 1));
            ASSERT(0 == SB.errorStatus());
        }
        else {
            ASSERTV(UTF8_ERR_OFFSET, Obj::toAscii(ERR_TYPE),
                                                Obj::toAscii(SB.errorStatus()),
                                                 ERR_TYPE == SB.errorStatus());
            ASSERT(0 == sb.sgetn(buf, 1));
            ASSERT(ERR_TYPE == SB.errorStatus());
        }
    }
}

/// Check that the specified `obj` is valid.  Check that `obj` is at the
/// specified position `objPos`, and that reading from `obj` to the end of
/// data (no more than 1024 bytes) matches the specified string `expText`.
/// Use the specified `line`, from which we were called, in error messages.
void checkWrapped(Obj            *obj,
                  PT              objPos,
                  const char     *expText,
                  int             line)
{
    ASSERTV(line, obj->isValid());

    PT op = obj->pubseekoff(0, bsl::ios_base::cur);
    ASSERTV(line, objPos, op, objPos == op);

    char buf[1024];
    IntPtr len = obj->sgetn(buf, sizeof(buf));
    ASSERTV(line, len < 1024);
    buf[len] = 0;
    ASSERTV(line, len, buf, expText, !bsl::strcmp(buf, expText));

    op = obj->pubseekpos(objPos);
    ASSERTV(line, op, objPos, op == objPos);

    len = obj->sgetn(buf, sizeof(buf));
    ASSERTV(line, len < 1024);
    buf[len] = 0;
    ASSERTV(line, len, buf, expText, !bsl::strcmp(buf, expText));
}

}  // close namespace u
}  // close unnamed namespace

// ============================================================================
//                               MAIN PROGRAM
// ----------------------------------------------------------------------------

int main(int argc, char *argv[])
{
    int                     test = argc > 1 ? bsl::atoi(argv[1]) : 0;
                         verbose = argc > 2;  (void)                 verbose;
                     veryVerbose = argc > 3;  (void)             veryVerbose;
                 veryVeryVerbose = argc > 4;  (void)         veryVeryVerbose;
             veryVeryVeryVerbose = argc > 5;  (void)     veryVeryVeryVerbose;
         veryVeryVeryVeryVerbose = argc > 6;  (void) veryVeryVeryVeryVerbose;
     veryVeryVeryVeryVeryVerbose = argc > 7;
     (void) veryVeryVeryVeryVeryVerbose;

    cout << "TEST " << __FILE__ << " CASE " << test << endl;

    bslma::TestAllocator ta(veryVeryVeryVeryVeryVerbose);
    bslma::TestAllocator da(veryVeryVeryVeryVeryVerbose);
    bslma::DefaultAllocatorGuard guard(&da);

    switch (test) { case 0:
      case 10: {
        // --------------------------------------------------------------------
        // USAGE EXAMPLE
        //
        // Concern:
        // 1. Demonstrate the usage of the `class` under test.
        //
        // Plan:
        // 1. Create a streambuf containing a string with invalid UTF-8.
        //
        // 2. Attempt to read it until reads fail.
        //
        // 3. Observe that `errorStatus` and
        //    `pubseekoff(0, bsl::ios_base::cur)` tell us what went wrong, and
        //    where.
        //
        // 4. Observe that all the data before the invalid code point was read.
        //
        // Testing:
        //   USAGE EXAMPLE
        // --------------------------------------------------------------------

    if (verbose) cout << "USAGE EXAMPLE\n"
                         "=============\n";

    const char *invalid = "Now is the time for all good men\n"
                          "to come to the aid of their country.\n"
                          "\xf0\x90\x80\x80\xe0\xa0\x80\xc2\x80\x90\xdf\xbf";
    FSB fsb(invalid, bsl::strlen(invalid));
    bsl::streambuf& myStreamBuf = fsb;

///Usage
///-----
//
///Example 1: Detecting invalid UTF-8 read from a `streambuf`:
/// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Suppose one has a `streambuf`, `myStreamBuf` containing UTF-8 that one wants
// to read, and check that it is valid UTF-8.
//
// First, create a `Utf8CheckingInStreamBufWrapper` that will wrap
// `myStreamBuf`:
// ```
    typedef bdlde::Utf8CheckingInStreamBufWrapper Wrapper;
    Wrapper wrapper;
    wrapper.reset(&myStreamBuf);
// ```
// Then, read the data from the `wrapper` `streambuf` until it stops yielding
// data.
// ```
    std::string s;
    bsl::streamsize len = 0, bytesRead;
    do {
        enum { k_READ_CHUNK = 10 };

        s.resize(len + k_READ_CHUNK);

        bytesRead = wrapper.sgetn(&s[len], k_READ_CHUNK);

        ASSERT(0 <= bytesRead);
        ASSERT(bytesRead <= k_READ_CHUNK);

        s.resize((len += bytesRead));
    } while (0 < bytesRead);

    ASSERT(wrapper.pubseekoff(0, bsl::ios_base::cur) ==
                                                       Wrapper::pos_type(len));
// ```
// Next, use the `errorStatus` accessor and `pubseekoff` manipulator to see
// what, if anything, went wrong and where.
// ```
    const int es = wrapper.errorStatus();

    if      (0 == es) {
        cout << "No errors occurred.\n";
    }
    else if (es < 0) {
if (verbose) {
        cout << "Incorrect UTF-8 encountered " << Wrapper::toAscii(es) <<
            " at offset " << wrapper.pubseekoff(0, bsl::ios_base::cur) << endl;
}
    }
    else {
        cout << "Non-UTF-8 error " << Wrapper::toAscii(es) << endl;
    }
// ```
// Now, we observe the output:
// ```
//  Incorrect UTF-8 encountered UNEXPECTED_CONTINUATION_OCTET at offset 79
// ```
// Finally, we observe that all the data from `myStreamBuf` up to offset 79
// was read into `s`, and that it's all correct UTF-8.
// ```
    ASSERT(len == s.end() - s.begin());
    ASSERT(bdlde::Utf8Util::isValid(&s[0], len));
// ```
      } break;
      case 9: {
        // --------------------------------------------------------------------
        // HOLDING SEEKLESS STREAMBUF TEST
        //
        // Concerns:
        // 1. That the object under test functions correctly when bound to a
        //    `streambuf` that doesn't support seeking.  Note that this
        //    component requires that, if the bound `streambuf` doesn't support
        //    seeking, it must always return a negative value.
        //
        // Plan:
        // 1. Create a class, `u::SeekLessFixedMemInStreamBuf`, which supports
        //    normal input, but always returns a negative value from seek
        //    attempts.
        //
        // 2. Bind the object under test to one beginning at offset 0, and
        //    observe that input works and that relative seeks within the
        //    buffer work, especially `seekoff(0, cur)`.
        //
        // 3. Start the bound object over again, and do a read on it to
        //    somewhere in the middle, then `reset` the object under test to
        //    it.  Observe that input works correctly, and that relative seeks
        //    within the buffer return an offset relative to the position when
        //    bound, not to the beginning of data.
        //
        // Testing:
        //   HOLDING SEEKLESS STREAMBUF TEST
        // --------------------------------------------------------------------

        if (verbose) cout << "HOLDING SEEKLESS STREAMBUF TEST\n"
                             "===============================\n";

        const char line1[] = "To be or not to be, that is the question.\n";
        const char line2[] =
                           "There are more things in heaven and earth,\n"
                           "Horatio, than are dreamt of in your philosophy.\n";

        const int len1 = u::intStrLen(line1);
        const int len2 = u::intStrLen(line2);

        if (verbose) { P_(len1);    P(len2); }

        {
            bsl::string s = bsl::string(line1) + line2;

            u::SeekLessFixedMemInStreamBuf fsb(s.c_str(), s.length());
            Obj sb(&fsb);    const Obj& SB = sb;

            ASSERT(SB.isValid());
            ASSERT(fsb.pubseekoff(0, bsl::ios_base::cur) < 0);
            ASSERT(fsb.pubseekpos(0) < 0);

            char buf[256];
            OT len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;

            ASSERT(len1 + len2 == len);
            ASSERT(s == buf);

            ASSERT(0 == SB.errorStatus());

            PT pos = sb.pubseekoff(0, bsl::ios_base::cur);
            ASSERT(PT(len1 + len2) == pos);

            pos = sb.pubseekoff(-len2, bsl::ios_base::cur);
            ASSERTV(PT(len1), pos, PT(len1) == pos);

            len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;
            ASSERT(len2 == len);

            ASSERT(s.substr(len1) == buf);

            ASSERT(ptZero == sb.pubseekpos(0));

            fsb.pubsetbuf(s.c_str(), s.length());
            len = fsb.sgetn(buf, len1);
            ASSERT(len1 == len);

            sb.reset(&fsb);

            ASSERT(ptZero == sb. pubseekoff(0, bsl::ios_base::cur));

            len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;

            ASSERT(len2 == len);
            ASSERT(s.substr(len1) == buf);

            ASSERT(PT(len2) == sb. pubseekoff(0, bsl::ios_base::cur));
        }
      } break;
      case 8: {
        // --------------------------------------------------------------------
        // PUTBACK BUFFER TEST
        //
        // Concerns:
        // 1. The putback buffer can successfully store up to 8 bytes.
        //
        // 2. Reads following a putback will read the data stored.
        //
        // Plan:
        // 1. Fill the putback buffer with data.
        //
        // 2. Read the data from the putback buffer.
        //
        // 3. Read all the data in the `streambuf` to the very end, but without
        //    reaching EOF.  All of it will fit in the streambuf input
        //    wrapper's buffer.
        //
        // 4. Back up to the beginning of the data with `sungetc`, verifying
        //    the data returned matches what it should be.
        //
        // 5. Read some data again.
        //
        // 6. Seek to the middle of the data, `sputbackc` some data at that
        //    point that does not match the original data, and then do a read
        //    of the putback buffer and some data following it, and verify
        //    the result.
        //
        // Testing:
        //   int_type sputbackc(char_type);
        //   int_type sungetc();
        // --------------------------------------------------------------------

        if (verbose) cout << "PUTBACK BUFFER TEST\n"
                             "===================\n";

        const bsl::string putBackStr = "abcdefgh";
        const IntPtr      PUT_BACK_STR_LEN = putBackStr.length();

        const bsl::string LINE1(
                               "There are more things in heaven and earth,\n");
        const IntPtr LINE1_LEN = LINE1.length();
        const bsl::string LINE2(
                          "Horatio, than are dreamt of in your philosophy.\n");
        const IntPtr LINE2_LEN = LINE2.length();
        const bsl::string LINE(LINE1 + LINE2);
        const IntPtr LINE_LEN = LINE.length();

        PT pos;

        ASSERT(LINE_LEN == LINE1_LEN + LINE2_LEN);

        FSB fsb(&LINE[0], LINE_LEN);
        Obj sb;    Obj& SB = sb;
        sb.reset(&fsb);

        if (verbose) cout << "Fill the putback buffer to capacity\n";

        const char *pc = putBackStr.c_str() + PUT_BACK_STR_LEN;
        while (putBackStr.c_str() < pc) {
            if (veryVerbose) P("trace to placate bde verify");

            Obj::char_type c = *--pc;
            ASSERT(Obj::int_type(c) == sb.sputbackc(c));
        }

        if (verbose) cout << "Now read the putback buffer.\n";

        char buf[1024];
        ASSERT(4 == sb.sgetn(buf, 4));
        buf[4] = 0;
        ASSERT(putBackStr.substr(0, 4) == buf);

        ASSERT(4 == sb.sgetn(buf + 4, 4));
        buf[8] = 0;
        ASSERT(putBackStr == buf);

        ASSERT(Obj::pos_type(0) == sb.pubseekoff(0, bsl::ios_base::cur));

        if (verbose) cout << "Now read the rest of the streambuf,"
                                        " stopping just before hitting EOF.\n";

        ASSERT(LINE1_LEN == sb.sgetn(buf, LINE1_LEN));
        buf[LINE1_LEN] = 0;
        ASSERTV(buf, LINE1, LINE1 == buf);

        ASSERT(0 == SB.errorStatus());
        ASSERTV(LINE1_LEN, pos,
                PT(LINE1_LEN) == (pos = sb.pubseekoff(0, bsl::ios_base::cur)));

        ASSERT(0 == SB.errorStatus());
        ASSERTV(LINE1_LEN, pos,
                PT(LINE1_LEN) == (pos = sb.pubseekoff(0, bsl::ios_base::cur)));

        ASSERT(LINE2_LEN == sb.sgetn(buf + LINE1_LEN, LINE2_LEN));
        buf[LINE_LEN] = 0;
        ASSERTV(buf + LINE1_LEN, LINE2, LINE2 == buf + LINE1_LEN);
        ASSERTV(buf, LINE, LINE == buf);

        ASSERT(0 == SB.errorStatus());
        ASSERTV(LINE_LEN, pos,
                 PT(LINE_LEN) == (pos = sb.pubseekoff(0, bsl::ios_base::cur)));

        if (verbose) cout << "Back up with `sungetc` to the start.\n";

        pc = LINE.c_str() + LINE_LEN;
        while (LINE.c_str() < pc) {
            if (veryVerbose) P("trace to placate bde verify");

            Obj::char_type c = *--pc;
            Obj::int_type ret = sb.sungetc();
            ASSERTV(pc - LINE.c_str(), c, ret, Obj::int_type(c) == ret);
            ASSERT(0 == SB.errorStatus());
            ASSERT(PT(pc - LINE.c_str())
                                      == sb.pubseekoff(0, bsl::ios_base::cur));
        }

        ASSERT(20 == sb.sgetn(buf, 20));
        buf[20] = 0;
        ASSERTV(buf, LINE, LINE.substr(0, 20) == buf);

        ASSERT(0 == SB.errorStatus());
        ASSERTV(pos, PT(20) == (pos = sb.pubseekoff(0, bsl::ios_base::cur)));

        if (verbose) cout << "`sungetc` before the start of the file fails.\n";

        sb.pubseekpos(0);
        ASSERT(Obj::traits_type::eof() == sb.sungetc());

        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());
        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));

        if (verbose) cout << "Absolute seek to start recovers and then we"
                                                  " are again able to read.\n";

        ASSERT(80 < LINE.length());
        ASSERT(0 == SB.errorStatus());

        ASSERT(50 == sb.sgetn(buf, 50));
        ASSERT(PT(50) == sb.pubseekoff(0, bsl::ios_base::cur));

        ASSERT(10 == sb.sgetn(buf, 10));
        buf[10] = 0;

        ASSERT(LINE.substr(50, 10) == buf);

        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(60) == sb.pubseekoff(0, bsl::ios_base::cur));

        if (verbose) cout << "Now putback a few characters, different from"
                                " the originals, in the middle of the data.\n";

        const char *woof = "woofwoof";
        pc = woof + 8;
        while (woof < pc) {
            if (veryVerbose) P("trace to placate bde verify");

            Obj::char_type c = *--pc;
            ASSERT(Obj::int_type(c) == sb.sputbackc(c));
        }

        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(52) == sb.pubseekoff(0, bsl::ios_base::cur));

        ASSERT(4 == sb.sgetn(buf, 4));
        buf[4] = 0;
        ASSERT(!bsl::strcmp("woof", buf));

        ASSERT(PT(56) == sb.pubseekoff(0, bsl::ios_base::cur));

        if (verbose) cout << "Do a single read that will read the putback"
                                  " data and the regular data following it.\n";

        ASSERT(20 == sb.sgetn(buf, 20));
        buf[20] = 0;

        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(76) == sb.pubseekoff(0, bsl::ios_base::cur));

        ASSERT((woof + 4) + LINE.substr(60, 16) == buf);

        if (verbose) cout << "Do a seek to the middle, put back some data,"
                               " seek back over it, then read all the data.\n";

        fsb.pubseekpos(50);
        sb.reset(&fsb);
        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(50) == sb.pubseekoff(0, bsl::ios_base::cur));

        pc = woof + 4;
        while (woof < pc) {
            if (veryVerbose) P("trace to placate bde verify");

            Obj::char_type c = *--pc;
            ASSERT(Obj::int_type(c) == sb.sputbackc(c));
        }

        ASSERT(2 == sb.sgetn(buf, 2));

        ASSERT(20 == sb.sgetn(buf, 20));
        buf[20] = 0;

        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(68) == sb.pubseekoff(0, bsl::ios_base::cur));

        ASSERTV(woof + 6, LINE.substr(50, 18), buf,
                                      (woof + 6) + LINE.substr(50, 18) == buf);

        if (verbose) cout << "Observe that if we do a relative seek back from"
                            " the normal buffer to where the putback data was,"
                                    " we WON'T wind up in the putback data.\n";

        ASSERT(PT(48) == sb.pubseekoff(-20, bsl::ios_base::cur));

        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(48) == sb.pubseekoff(0, bsl::ios_base::cur));

        ASSERT(20 == sb.sgetn(buf, 20));
        buf[20] = 0;

        ASSERT(LINE.substr(48, 20) == buf);
        ASSERT(woof + 6 != bsl::string(buf).substr(0, 2));
      } break;
      case 7: {
        // --------------------------------------------------------------------
        // BROKEN GLASS TEST
        //
        // Concerns:
        // 1. See test doc in box at start of function `brokenGlassTest` above.
        //
        // Plan:
        // 1. See test doc in box at start of function `brokenGlassTest` above.
        //
        // Testing:
        //   BROKEN GLASS TEST
        // --------------------------------------------------------------------

        if (verbose) cout << "BROKEN GLASS TEST\n"
                             "=================\n";

        enum { k_NUM_ITERATIONS = 550 };

        bsl::string validUtf8;
        validUtf8.reserve(1024);

        // The data in the held `streambuf` will consist of `[ 0 .. 3 ]` random
        // correct UTF-8 code points.

        for (int numValidCodePoints = 0; numValidCodePoints < 4;
                                                        ++numValidCodePoints) {
            // Repeat this test many times.

            if (veryVerbose) P(numValidCodePoints);

            for (int ti = 0; ti < k_NUM_ITERATIONS; ++ti) {
                // Set `validUtf8` to `numValidCodePoints` of random correct
                // UTF-8.

                validUtf8.clear();
                for (int ii = 0; ii < numValidCodePoints; ++ii) {
                    if (veryVeryVeryVerbose) P("trace to satiate bde verify");

                    u::appendRandCorrectCodePoint(&validUtf8, false);
                }

                if (veryVeryVerbose) { T_ P(validUtf8); }

                // Iterate through `DATA`, each entry of which is a UTF-8
                // string containing one invalid UTF-8 code point.

                for (int tj = 0; tj < u::NUM_DATA; ++tj) {
                    const u::Data& data = u::DATA[tj];

                    if (veryVeryVeryVerbose) { T_ T_ P(data.d_lineNum); }

                    // Try the test without and with `SEEK_FIRST` set.

                    for (int ts = 0; ts < 2; ++ts) {
                        const bool SEEK_FIRST = ts;

                        if (veryVeryVeryVeryVerbose) P(
                                                "trace to satiate bde verify");
                        // Try the test without and with `APPEND_VALID` set.

                        for (int ta = 0; ta < 2; ++ta) {
                            const bool APPEND_VALID = ta;

                            if (veryVeryVeryVeryVeryVerbose) P(
                                                "trace to satiate bde verify");
                            u::brokenGlassTest(data,
                                               validUtf8,
                                               SEEK_FIRST,
                                               APPEND_VALID);
                        }
                    }
                }
            }
        }
      } break;
      case 6: {
        // --------------------------------------------------------------------
        // TESTING CORRECT UTF-8 STRINGS
        //
        // Concern:
        // 1. That the type under test can process correct UTF-8 containing
        //    non-Ascii code points.
        //
        // Plan:
        // 1. Create a function `u::appendRandCorrectCodePoint` which will
        //    append a correct code point to a string, and use it to create
        //    strings of several code points of random UTF-8.
        //    - Iterate, reaching subset portions of the random correct UTF-8.
        //
        //    - Check the data obtained is correct.
        //
        // 2. Take the large correct UTF-8 string and read it in small
        //    sections, concatenating them into one large result and comparing
        //    that with the original.
        //
        // 3. Read the whole large UTF-8 string in one go.
        //
        // 4. Initialize a `streambuf` to having zero length data, read from
        //    it, and observe EOF.
        //
        // Testing:
        //   VALID UTF8 TEST
        // --------------------------------------------------------------------

        if (verbose) cout << "TESTING CORRECT UTF-8 STRINGS\n"
                             "=============================\n";

        enum { k_NUM_TRIALS = 100 * 1000 };

        if (verbose) cout <<
                            "Read randomly generated correct UTF-8 strings.\n";

        u::RandGen rand;
        for (int ii = 0; ii < k_NUM_TRIALS; ++ii) {
            bsl::string utf8Str;

            int len = rand() % 8 + 1;

            for (int jj = 0; jj < len; ++jj) {
                if (veryVeryVerbose) P("trace to satiate bde verify");

                u::appendRandCorrectCodePoint(&utf8Str, false);
            }

            if (veryVerbose) { P_(len); P(utf8Str); }

            ASSERT(!utf8Str.empty());
            ASSERT(utf8Str[0]);
            ASSERT(Util::isValid(utf8Str.c_str()));
            ASSERT(Util::isValid(utf8Str.data(), utf8Str.length()));
            ASSERT(utf8Str.length() == bsl::strlen(utf8Str.c_str()));
            const char *invalid = 0;
            ASSERT(Util::numCodePointsIfValid(&invalid, utf8Str.c_str()));
            ASSERT(!invalid);

            const int firstCodePointSize = u::codePointSize(utf8Str[0]);
            for (unsigned kk = 1; kk <= utf8Str.length(); ++kk) {
                FSB fsb(&utf8Str[0], utf8Str.length());
                Obj sb;    Obj& SB = sb;
                sb.reset(&fsb);

                if (veryVeryVerbose) { P_(len); P_(utf8Str); P(kk); }

                char buffer[100];
                OT got = sb.sgetn(buffer, kk);
                ASSERT(0 == SB.errorStatus());
                ASSERT(0 < got);
                buffer[got] = 0;
                ASSERT(u::intStrLen(buffer) == got);
                ASSERT(static_cast<int>(kk) == got);

                invalid = 0;
                IntPtr ncp = Util::numCodePointsIfValid(&invalid, buffer);
                ASSERT(0 != ncp);
                ASSERT(!invalid == (0 < ncp));

                if (ncp < 0) {
                    ASSERT(firstCodePointSize != static_cast<int>(kk));

                    char c = *invalid;

                    const int overrunFCPS = u::codePointSize(c);
                    ASSERT(got - (invalid - buffer) < overrunFCPS);

                    *const_cast<char *>(invalid) = 0;

                    ASSERT(Util::isValid(buffer));
                    const char *invalidB = 0;
                    ncp = Util::numCodePointsIfValid(&invalidB, buffer);
                    if (firstCodePointSize <= static_cast<int>(kk)) {
                        ASSERT(0 < ncp);
                        ASSERT(0 == invalidB);
                    }

                    *const_cast<char *>(invalid) = c;
                }

                ASSERT(!bsl::strncmp(buffer, utf8Str.c_str(),
                                                    static_cast<size_t>(got)));

                const bool whole = utf8Str.length() == kk;
                if (whole) {
                    ASSERTV(u::dumpStr(buffer), Util::isValid(buffer));
                    ASSERT(got == static_cast<int>(kk));
                    ASSERT(utf8Str == buffer);
                }

                got = sb.sgetn(buffer, 1);
                ASSERT(0 == SB.errorStatus());
                ASSERT((whole ? 0 : 1) == got);
            }
        }

        if (verbose) cout << "Read large correct UTF-8 string in pieces.\n";
        {
            FSB fsb(u::charUtf8MultiLang, u::UTF8_MULTI_LANG_STR_LEN);
            Obj sb;    Obj& SB = sb;
            sb.reset(&fsb);

            char buffer[u::UTF8_MULTI_LANG_STR_LEN + 10];

            for (unsigned readSoFar = 0;
                                    readSoFar < u::UTF8_MULTI_LANG_STR_LEN; ) {
                if (veryVerbose) P("trace to placate bde verify");

                int readLen = rand() % 127 + 1;
                readLen = bsl::min<int>(
                                       readLen,
                                       u::UTF8_MULTI_LANG_STR_LEN - readSoFar);

                const OT got = sb.sgetn(buffer + readSoFar, readLen);
                ASSERT(got == readLen);
                ASSERT(0 == SB.errorStatus());

                readSoFar += readLen;

                ASSERT(0 == bsl::memcmp(u::charUtf8MultiLang,
                                        buffer,
                                        readSoFar));
            }

            ASSERT(Obj::traits_type::eof() == sb.sbumpc());
            ASSERT(0 == SB.errorStatus());
        }

        if (verbose) cout << "Read large correct UTF-8 string at once.\n";
        {
            FSB fsb(u::charUtf8MultiLang, u::UTF8_MULTI_LANG_STR_LEN);
            Obj sb;    Obj& SB = sb;
            sb.reset(&fsb);

            char buffer[u::UTF8_MULTI_LANG_STR_LEN + 10];

            const OT got = sb.sgetn(buffer, sizeof(buffer));
            ASSERT(u::UTF8_MULTI_LANG_STR_LEN == got);
            ASSERT(0 == bsl::memcmp(u::charUtf8MultiLang,
                                    buffer,
                                    u::UTF8_MULTI_LANG_STR_LEN));
            ASSERT(0 == SB.errorStatus());
        }

        if (verbose) cout << "Empty streambuf, zero read.\n";
        {
            FSB fsb("", 0);
            Obj sb;    Obj& SB = sb;
            sb.reset(&fsb);

            char buffer[1];

            OT got = sb.sgetn(buffer, 0);
            ASSERT(0 == got);
            ASSERT(0 == SB.errorStatus());

            got = sb.pubseekpos(0);
            ASSERT(0 == got);
            ASSERT(0 == SB.errorStatus());

            got = sb.sgetn(buffer, 1);
            ASSERT(0 == got);
            ASSERT(0 == SB.errorStatus());

            got = sb.pubseekpos(0);
            ASSERT(0 == got);
            ASSERT(0 == SB.errorStatus());

            ASSERT(Obj::traits_type::eof() == sb.sbumpc());
            ASSERT(0 == SB.errorStatus());
        }
      } break;
      case 5: {
        // --------------------------------------------------------------------
        // ATTEMPT OUTPUT
        //
        // Concern:
        // 1. That the object under test shuts down when output is attempted.
        //
        // 2. After the output attempt, `errorStatus` returns
        //    `k_OUTPUT_ATTEMPT`.
        //
        // 3. Attempts to read or seek fail, and do not change the value of
        //    `errorStatus`.
        //
        // Plan:
        // 1. Create a streambuf.
        //
        // 2. Attempt output on it with `sputn`.
        //    - Observe that the output attempt fails.
        //
        //    - Observe that `errorStatus` is `k_OUTPUT_ATTEMPT`.
        //
        // 3. Attempt input, first with `sgetn`, then with `sbumpc`.
        //    - Observe that the input attempt fails.
        //
        //    - Observe that `errorStatus` remains `k_OUTPUT_ATTEMPT`.
        //
        // 4. Repeat the test, except attempt output with `sputc` instead of
        //    `sgetn`.
        //
        // Testing:
        //   size_t sputn(const char *, size_t);
        //   int sputc(char);
        // --------------------------------------------------------------------

        if (verbose) cout << "ATTEMPT OUTPUT\n"
                             "==============\n";

        enum OutputType { e_SPUTN, e_SPUTC };
        enum InputType { e_SGETN, e_SBUMPC, e_SEEK };

        for (int ti = 0; ti < 2; ++ti) {
            const OutputType opt = 0 == ti ? e_SPUTN : e_SPUTC;

            if (veryVerbose) P(opt);

            for (int tj = 0; tj < 3; ++tj) {
                const InputType ipt = 0 == tj ? e_SGETN
                                   : (1 == tj ? e_SBUMPC
                                              : e_SEEK);

                if (veryVeryVerbose) { P_(opt); P(ipt); }

                FSB fsb(u::charUtf8MultiLang, u::UTF8_MULTI_LANG_STR_LEN);
                Obj sb(&fsb);    Obj& SB = sb;

                switch (opt) {
                  case e_SPUTN: {
                    ASSERT(0 == sb.sputn("woof", 4));
                  } break;
                  case e_SPUTC: {
                    ASSERT(Obj::traits_type::eof() == sb.sputc('x'));
                  }
                }
                ASSERT(0 == SB.errorStatus());

                switch (ipt) {
                  case e_SGETN: {
                    char buf[u::UTF8_MULTI_LANG_STR_LEN + 10];
                    IntPtr len = sb.sgetn(buf, sizeof(buf));
                    ASSERTV(u::UTF8_MULTI_LANG_STR_LEN, len,
                                            u::UTF8_MULTI_LANG_STR_LEN == len);
                    ASSERT(0 == SB.errorStatus());
                    buf[u::UTF8_MULTI_LANG_STR_LEN] = 0;
                    ASSERT(!bsl::strcmp(buf, u::charUtf8MultiLang));

                    ASSERT(0 == SB.errorStatus());
                  } break;
                  case e_SBUMPC: {
                    const int c = sb.sbumpc();
                    ASSERT(Obj::traits_type::eof() != c);
                    ASSERTV(*u::charUtf8MultiLang, c, char(c),
                                             *u::charUtf8MultiLang == char(c));

                    ASSERT(0 == SB.errorStatus());
                  } break;
                  case e_SEEK: {
                    ASSERT(SB.isValid());
                    ASSERT(0 == SB.errorStatus());
                    ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));
                  }
                }
            }
        }
      } break;
      case 4: {
        // --------------------------------------------------------------------
        // TESTING TOASCII
        //
        // Concerns:
        // 1. That `toAscii` returns expected strings if its input is 0 or
        //    `k_SEEK_FAIL`.
        //
        // 2. For other values, `toAscii` returns exactly the same values as
        //    `bdlde::Utf8Util::toAscii`.  Note that all recognized values are
        //    in the range `[ -10 .. k_SEEK_FAIL ]`
        //
        // Plan:
        // 1. Iterate over the range `[ -20 .. +20 ]` testing the function on
        //    all such values;
        //
        // Testing:
        //   const char toAscii(int);
        // --------------------------------------------------------------------

        if (verbose) cout << "TESTING TOASCII\n"
                             "===============\n";

        bool doneA = false, doneB = false, doneC = false;
        for (int errVal = -20; errVal < +20; ++errVal) {
            const bsl::string result = Obj::toAscii(errVal);

            if (veryVerbose) { P_(errVal); P(result); }

            if (Obj::k_SEEK_FAIL == errVal) {
                ASSERT("SEEK_FAIL" == result);
                doneA = true;
            }
            else if (0 == errVal) {
                ASSERT("NO_ERROR" == result);
                doneB = true;
            }
            else {
                ASSERT(result == bdlde::Utf8Util::toAscii(errVal));
                doneC = true;
            }
        }

        ASSERT(doneA && doneB && doneC);
      } break;
      case 3: {
        // --------------------------------------------------------------------
        // CREATOR AND RESET TEST
        //
        // Concern:
        // 1. That the default c'tor works properly.
        //
        // 2. That the c'tor passed the `streambuf` to be held works properly.
        //
        // 3. That `reset` works properly.
        //
        // 4. If an allocator is passed to either c'tor, it is used and the
        //    default allocator isn't.
        //
        // 5. If no allocator is passed to either c'tor, the default allocator
        //    is used.
        //
        // Plan:
        // 1. Write a function `u::checkWrapped` which is passed a pointer to
        //    an object under test, the expected offset to be returned from
        //    `seekoff(0, cur)` on it, the string expected to be encountered
        //    by reading to the end of data, and the line number from which it
        //    was called for messages.  It tests out the state of the object
        //    that it was passed.
        //
        // 2. Have many blocks of code where the object under test is
        //    constructed with every possible overload of the constructors,
        //    and then in some cases later reset.  Do this:
        //    - With the held `streambuf` at position zero and at another
        //      position when bound to the wrapping `streambuf`.
        //
        //    - Both of the above, with the held `streambuf` being a type that
        //      supports seeking, and with it being a type that doesn't.
        //
        //    - All of the above, with a non-default allocator passed to the
        //      c'tor, and with no allocator passed to the c'tor.
        //
        // 3. In many of the blocks the object is constructed with
        //    `bslma::TestAllocator`, so if memory is leaked by the d'tor, the
        //    test will abort when the test allocator is destroyed.
        //
        // Testing:
        //   Utf8CheckingInStreamBufWrapper();
        //   Utf8CheckingInStreamBufWrapper(bslma::Allocator *);
        //   Utf8CheckingInStreamBufWrapper(streambuf *);
        //   Utf8CheckingInStreamBufWrapper(streambuf *, bslma::Allocator *);
        //   ~Utf8CheckingInStreamBufWrapper();
        //   reset(bsl::streambuf *);
        //   isValid() const;
        // --------------------------------------------------------------------

        if (verbose) cout << "CREATOR AND RESET TEST\n"
                             "======================\n";

        const char line1[] = "To be or not to be, that is the question.\n";
        const char line2[] =
                           "There are more things in heaven and earth,\n"
                           "Horatio, than are dreamt of in your philosophy.\n";

        const char line3[] =
                           "To be or not to be, that is the question.\n"
                           "There are more things in heaven and earth,\n"
                           "Horatio, than are dreamt of in your philosophy.\n";

        const IntPtr len1 = sizeof(line1) - 1;
        const IntPtr len2 = sizeof(line2) - 1;
        const IntPtr len3 = len1 + len2;

        ASSERT(0 == ta.numAllocations());
        ASSERT(0 == da.numAllocations());

        if (verbose) cout << "Seeking held buffer, c'tor always passed ta\n";
        {
            FSB fsb(line3, len3);
            Obj sb(&ta);    const Obj& SB = sb;

            ASSERT(!SB.isValid());
            ASSERT(1 == ta.numBlocksInUse());

            sb.reset(&fsb);

            u::checkWrapped(&sb, 0, line3, __LINE__);

            fsb.pubseekpos(len1);

            sb.reset(0);
            ASSERT(!SB.isValid());
            ASSERT(1 == ta.numBlocksInUse());
            ASSERT(1 == ta.numAllocations());

            sb.reset(&fsb);

            u::checkWrapped(&sb, len1, line2, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(1 == ta.numAllocations());

        {
            FSB fsb(line3, len3);
            Obj sb(&fsb, &ta);

            ASSERT(1 == ta.numBlocksInUse());
            ASSERT(2 == ta.numAllocations());

            u::checkWrapped(&sb, 0, line3, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(2 == ta.numAllocations());

        {
            FSB fsb(line3, len3);
            fsb.pubseekpos(len1);
            Obj sb(&fsb, &ta);

            ASSERT(1 == ta.numBlocksInUse());
            ASSERT(3 == ta.numAllocations());

            u::checkWrapped(&sb, len1, line2, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(3 == ta.numAllocations());

        if (verbose) cout << "Seekless held buffer, c'tor always passed ta\n";
        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            Obj sb(&ta);    const Obj& SB = sb;

            ASSERT(!SB.isValid());
            ASSERT(1 == ta.numBlocksInUse());

            sb.reset(&fsb);

            u::checkWrapped(&sb, 0, line3, __LINE__);

            sb.pubseekpos(len1);

            u::checkWrapped(&sb, len1, line2, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(4 == ta.numAllocations());

        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            Obj sb(&fsb, &ta);

            ASSERT(1 == ta.numBlocksInUse());
            ASSERT(5 == ta.numAllocations());

            u::checkWrapped(&sb, 0, line3, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(5 == ta.numAllocations());

        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            char buf[1024];
            ASSERT(len1 == fsb.sgetn(buf, len1));
            Obj sb(&fsb, &ta);

            ASSERT(1 == ta.numBlocksInUse());
            ASSERT(6 == ta.numAllocations());

            u::checkWrapped(&sb, 0, line2, __LINE__);
        }

        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(6 == ta.numAllocations());

        ASSERT(0 == da.numAllocations());

        if (verbose) cout << "Seeking held buffer, c'tor alloc defaults\n";
        {
            FSB fsb(line3, len3);
            Obj sb;    const Obj& SB = sb;

            ASSERT(!SB.isValid());
            ASSERT(1 == da.numBlocksInUse());

            sb.reset(&fsb);

            u::checkWrapped(&sb, 0, line3, __LINE__);

            fsb.pubseekpos(len1);

            sb.reset(0);
            ASSERT(!SB.isValid());
            ASSERT(1 == da.numBlocksInUse());
            ASSERT(1 == da.numAllocations());

            sb.reset(&fsb);

            u::checkWrapped(&sb, len1, line2, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == da.numBlocksInUse());
        ASSERT(1 == da.numAllocations());

        {
            FSB fsb(line3, len3);
            Obj sb(&fsb);

            ASSERT(1 == da.numBlocksInUse());
            ASSERT(2 == da.numAllocations());

            u::checkWrapped(&sb, 0, line3, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == da.numBlocksInUse());
        ASSERT(2 == da.numAllocations());

        {
            FSB fsb(line3, len3);
            fsb.pubseekpos(len1);
            Obj sb(&fsb);

            ASSERT(1 == da.numBlocksInUse());
            ASSERT(3 == da.numAllocations());

            u::checkWrapped(&sb, len1, line2, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == da.numBlocksInUse());
        ASSERT(3 == da.numAllocations());

        if (verbose) cout << "Seekless held buffer, c'tor always passed ta\n";
        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            Obj sb;    const Obj& SB = sb;

            ASSERT(!SB.isValid());
            ASSERT(1 == da.numBlocksInUse());

            sb.reset(&fsb);

            u::checkWrapped(&sb, 0, line3, __LINE__);

            fsb.pubsetbuf(line3, len3);
            char buf[1024];
            ASSERT(len1 == fsb.sgetn(buf, len1));

            sb.reset(&fsb);

            u::checkWrapped(&sb, 0, line2, __LINE__);

            sb.pubseekpos(0);

            u::checkWrapped(&sb, 0, line2, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == da.numBlocksInUse());
        ASSERT(4 == da.numAllocations());

        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            Obj sb(&fsb);

            ASSERT(1 == da.numBlocksInUse());
            ASSERT(5 == da.numAllocations());

            u::checkWrapped(&sb, 0, line3, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == da.numBlocksInUse());
        ASSERT(5 == da.numAllocations());

        {
            u::SeekLessFixedMemInStreamBuf fsb(line3, len3);
            char buf[1024];
            ASSERT(len1 == fsb.sgetn(buf, len1));
            Obj sb(&fsb);

            ASSERT(1 == da.numBlocksInUse());
            ASSERT(6 == da.numAllocations());

            u::checkWrapped(&sb, 0, line2, __LINE__);
        }

        ASSERT(6 == ta.numAllocations());
        ASSERT(0 == ta.numBlocksInUse());
        ASSERT(6 == da.numAllocations());
      } break;
      case 2: {
        // --------------------------------------------------------------------
        // TESTING LARGE ASCII STRING AND SEEKING
        //
        // Concerns:
        // 1. That the wrapper functions properly on an Ascii string that will
        //    fill several buffers.
        //
        // Plan:
        // 1. Create a buffer filled with a large amount of random Ascii data.
        //
        // 2. Read it in pieces.
        //
        // 3. Seek back to the start and read the whole thing in one go,
        //    attempting to read more bytes than are present and reach EOF.
        //
        // 4. Seek back and read the exact number of bytes present, thus
        //    avoiding provoking EOF.
        //
        // 5. Do a null seek to verify location and observe this clears
        //    `errorStatus` and returns the correct offset.
        //
        // 6. Attempt to seek past EOF:
        //    - Observe we get a seek failure.
        //
        //    - Follow it by a null relative seek attempt and verify that that
        //      fails.
        //
        //    - Follow that by an absolute seek, which should work.
        //
        // 7. Attempt an absolute seek to a negative location.
        //    - Observe we get a seek failure.
        //
        //    - Do an absolute seek (relative to end of file) and observe that
        //      works and clears `errorStatus`.
        //
        // 8. Do a few random seeks.
        //
        // 9. Seek to the center of the data and read the second half of the
        //    data in pieces.
        //
        // 10. Iteration
        //     o Seek to a random location.
        //
        //     o Read to the end of the data via `sbumpc`.
        //
        // Testing:
        //   size_t sgetn(char *, size_t);
        //   pos_type pubseekoff(off_type, seekdir, openmode);
        //   pos_type pubseekpos(pos_type, openmode);
        //   int_type sbumpc();
        //   int errorStatus() const;
        //   bool isValid() const;
        // --------------------------------------------------------------------

        if (verbose) cout << "TESTING LARGE ASCII STRING AND SEEKING\n"
                             "======================================\n";

        enum { k_ASCII_STR_LEN = 32 * 1024 };
        bsl::string asciiStr;    bsl::string& ASCII_STR = asciiStr;
        asciiStr.resize(k_ASCII_STR_LEN);
        char *asciiStart = &asciiStr[0];    const char *asciiEnd =
                                                  asciiStart + k_ASCII_STR_LEN;
        for (char *pc = asciiStart; pc < asciiEnd; ++pc) {
            if (veryVerbose) P("trace to placate bde verify");

            do {
                if (veryVeryVerbose) P("trace to placate bde verify");

                *pc = u::rg.getChar();
                *pc &= 0x7f;
            } while (!*pc || !bsl::isprint(static_cast<unsigned char>(*pc)));
        }
        ASSERT(asciiStr.length() == bsl::strlen(asciiStart));

        PT pos;

        FSB fsb(asciiStart, asciiStr.length());
        Obj sb;    Obj& SB = sb;

        ASSERT(!SB.isValid());

        sb.reset(&fsb);

        ASSERT(SB.isValid());

        char buf[40 * 1024];

        if (verbose) cout << "Read little bits.\n";

        unsigned primeLen = 7;
        buf[primeLen] = 0;
        unsigned uu = 0;
        for ( ; uu < asciiStr.length() - primeLen; uu += primeLen) {
            if (veryVeryVerbose) P("trace to placate bde verify");

            const size_t len = sb.sgetn(buf, primeLen);
            ASSERTV(len, primeLen, uu, len == primeLen);
            ASSERT(asciiStr.substr(uu, primeLen) == buf);
            ASSERTV(Obj::toAscii(sb.errorStatus()), 0 == sb.errorStatus());
            ASSERT(SB.isValid());
            ASSERT((pos = sb.pubseekoff(0, bsl::ios_base::cur)) <
                                                              k_ASCII_STR_LEN);
            ASSERTV(pos, uu, primeLen, pos == Obj::pos_type(uu + primeLen));
            ASSERTV(Obj::toAscii(sb.errorStatus()), 0 == sb.errorStatus());
            ASSERT(SB.isValid());
        }

        bsl::size_t lastLen = sb.sgetn(buf, primeLen);
        ASSERT(0 < lastLen);
        ASSERT(lastLen < primeLen);
        buf[lastLen] = 0;

        ASSERT(ASCII_STR.substr(uu) == buf);
        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(k_ASCII_STR_LEN) == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout <<
                   "Go back to the start and read it all in at once to EOF.\n";

        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::beg));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        ASSERT(k_ASCII_STR_LEN == sb.sgetn(buf, sizeof(buf)));
        buf[k_ASCII_STR_LEN] = 0;

        ASSERT(ASCII_STR == buf);
        ASSERTV(SB.errorStatus(), Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
        ASSERT(PT(k_ASCII_STR_LEN) == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(SB.isValid());

        if (verbose) cout << "Now go back and read the whole thing, the"
                                             " exact # of bytes without EOF\n";

        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::beg));
        ASSERT(0 == SB.errorStatus());

        ASSERT(k_ASCII_STR_LEN == sb.sgetn(buf, k_ASCII_STR_LEN));
        buf[k_ASCII_STR_LEN] = 0;

        ASSERT(ASCII_STR == buf);
        ASSERTV(SB.errorStatus(), Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
        ASSERT(sb.pubseekoff(0, bsl::ios_base::cur) ==
                                               Obj::pos_type(k_ASCII_STR_LEN));
        ASSERT(0 == SB.errorStatus());

        if (verbose) cout << "Do a null seek and verify our exact location.\n";

        ASSERT(PT(k_ASCII_STR_LEN) == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(sb.pubseekoff(0, bsl::ios_base::cur) == PT(k_ASCII_STR_LEN));
        ASSERT(0 == SB.errorStatus());

        if (verbose) cout << "Attempt to seek past EOF.  Seek fail.\n";

        pos = sb.pubseekoff(1, bsl::ios_base::cur);
        ASSERTV(k_ASCII_STR_LEN, pos, PT(-1) == pos);
        ASSERTV(sb.pubseekoff(0, bsl::ios_base::cur), pos,
                                  sb.pubseekoff(0, bsl::ios_base::cur) == pos);
        ASSERTV(Obj::toAscii(SB.errorStatus()),
                                         Obj::k_SEEK_FAIL == SB.errorStatus());
        ASSERT(!SB.isValid());

        if (verbose) cout << "Confirm relative seek now fails.\n";

        pos = sb.pubseekoff(0, bsl::ios_base::cur);
        ASSERTV(k_ASCII_STR_LEN, pos, PT(-1) == pos);
        ASSERTV(Obj::toAscii(SB.errorStatus()),
                                         Obj::k_SEEK_FAIL == SB.errorStatus());
        ASSERT(!SB.isValid());

        if (verbose) cout << "Absolute seek to beginning recovers.\n";

        pos = sb.pubseekpos(0);
        ASSERT(0 == pos);
        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "Forward relative seek fails.\n";

        pos = sb.pubseekoff(1, bsl::ios_base::cur);
        ASSERTV(k_ASCII_STR_LEN, pos, PT(-1) == pos);
        ASSERTV(pos, sb.pubseekoff(0, bsl::ios_base::cur) == pos);
        ASSERTV(Obj::toAscii(SB.errorStatus()),
                                         Obj::k_SEEK_FAIL == SB.errorStatus());
        ASSERT(!SB.isValid());

        if (verbose) cout << "Absolute seek to beginning recovers.\n";

        pos = sb.pubseekpos(0);
        ASSERT(ptZero == pos);
        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "Forward absolute seek fails.\n";

        pos = sb.pubseekpos(1);
        ASSERTV(k_ASCII_STR_LEN, pos, PT(-1) == pos);
        ASSERTV(pos, sb.pubseekoff(0, bsl::ios_base::cur) == pos);
        ASSERTV(Obj::toAscii(SB.errorStatus()),
                                         Obj::k_SEEK_FAIL == SB.errorStatus());
        ASSERT(!SB.isValid());

        if (verbose) cout << "Absolute seek to beginning recovers.\n";

        pos = sb.pubseekpos(0);
        ASSERT(ptZero == pos);
        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "Absolute seek past the end fails.\n";

        pos = sb.pubseekpos(k_ASCII_STR_LEN + 100);
        ASSERTV(k_ASCII_STR_LEN, pos, PT(-1) == pos);
        ASSERTV(pos, sb.pubseekoff(0, bsl::ios_base::cur) == pos);
        ASSERTV(Obj::toAscii(SB.errorStatus()),
                                         Obj::k_SEEK_FAIL == SB.errorStatus());
        ASSERT(!SB.isValid());

        if (verbose) cout << "Absolute seek to beginning recovers.\n";

        pos = sb.pubseekpos(0);
        ASSERT(ptZero == pos);
        ASSERT(ptZero == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "Read to the end and seek 1/4 of the way back\n";

        pos = sb.sgetn(buf, sizeof(buf));
        ASSERTV(pos, std::streamsize(k_ASCII_STR_LEN) == pos);
        buf[static_cast<size_t>(pos)] = 0;
        ASSERT(0 == SB.errorStatus());
        ASSERT(SB.isValid());
        ASSERT(ASCII_STR == buf);
        ASSERTV(SB.errorStatus(), Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
        ASSERT(PT(k_ASCII_STR_LEN) == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(SB.isValid());

        if (verbose) cout << "Seekoff 1/4 of the way back\n";

        ASSERT(pos = sb.pubseekoff(-k_ASCII_STR_LEN / 4, bsl::ios_base::cur));
        ASSERT(3 * k_ASCII_STR_LEN / 4 == pos);
        ASSERT(pos == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERTV(SB.errorStatus(), Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "Seekpos another 1/4 of the way back\n";

        pos = sb.pubseekpos(k_ASCII_STR_LEN / 2);
        ASSERT(PT(k_ASCII_STR_LEN / 2) == pos);
        ASSERT(pos == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERTV(SB.errorStatus(), Obj::toAscii(SB.errorStatus()),
                                                        0 == SB.errorStatus());
        ASSERT(SB.isValid());

        if (verbose) cout << "From halfway through, read with a different"
                                                                   " prime.\n";

        primeLen = 51;
        buf[primeLen] = 0;
        uu = static_cast<unsigned>(pos);
        for ( ; uu < asciiStr.length() - primeLen; uu += primeLen) {
            if (veryVeryVerbose) P("trace to placate bde verify");

            const size_t gotten = static_cast<size_t>(sb.sgetn(buf, primeLen));
            ASSERT(primeLen == gotten);
            ASSERT(asciiStr.substr(uu, primeLen) == buf);
            pos = sb.pubseekoff(0, bsl::ios_base::cur);
            ASSERT(pos < PT(k_ASCII_STR_LEN));
            ASSERT(pos == Obj::pos_type(uu + primeLen));
            ASSERT(0 == sb.errorStatus());
            ASSERT(SB.isValid());
        }

        lastLen = sb.sgetn(buf, primeLen);
        ASSERT(0 < lastLen);
        ASSERT(lastLen < primeLen);
        buf[lastLen] = 0;
        ASSERT(SB.isValid());

        ASSERT(ASCII_STR.substr(uu) == buf);
        ASSERT(0 == SB.errorStatus());
        ASSERT(PT(k_ASCII_STR_LEN) == sb.pubseekoff(0, bsl::ios_base::cur));
        ASSERT(SB.isValid());

        if (verbose) cout << "Start from random locations and `sbumpc` to"
                                                                     " end.\n";

        u::RandGen rand;
        for (int ti = 0; ti < 40; ++ti) {
            pos = k_ASCII_STR_LEN / 4 + (rand() % (k_ASCII_STR_LEN / 2));

            if (veryVerbose) P(pos);

            ASSERT(sb.pubseekpos(0) == ptZero);
            ASSERT(k_ASCII_STR_LEN == sb.sgetn(buf, sizeof(buf)));
            ASSERT(sb.pubseekpos(pos) == pos);

            for (const char *pc = asciiStart + static_cast<size_t>(pos);
                                                             pc < asciiEnd; ) {
                if (veryVeryVerbose) P("trace to placate bde verify");

                Obj::int_type c = sb.sbumpc();
                ASSERT(c == Obj::int_type(*pc++));
                ASSERT(0 == SB.errorStatus());
                ASSERTV(sb.pubseekoff(0, bsl::ios_base::cur), pc - asciiStart,
                                        sb.pubseekoff(0, bsl::ios_base::cur) ==
                                                          PT(pc - asciiStart));
                ASSERT(SB.isValid());
            }

            ASSERT(Obj::traits_type::eof() == sb.sbumpc());
            ASSERT(0 == SB.errorStatus());
            ASSERT(SB.isValid());
            ASSERT(PT(k_ASCII_STR_LEN) ==
                                         sb.pubseekoff(0, bsl::ios_base::cur));
        }
      } break;
      case 1: {
        // --------------------------------------------------------------------
        // BREATHING TEST
        //
        // Concerns:
        // 1. Basic functionality.
        //
        // Plan:
        // 1. Attach a `streambuf` to some memory and do some reads and seeks
        //    on it.
        //
        // Testing:
        //   BREATHING TEST
        // --------------------------------------------------------------------

        if (verbose) cout << "BREATHING TEST\n"
                             "==============\n";

        const char line1[] = "To be or not to be, that is the question.\n";
        const char line2[] =
                           "There are more things in heaven and earth,\n"
                           "Horatio, than are dreamt of in your philosophy.\n";

        const int len1 = u::intStrLen(line1);
        const int len2 = u::intStrLen(line2);

        if (verbose) { P_(len1);    P(len2); }

        {
            bsl::string s = bsl::string(line1) + line2;

            FSB fsb(s.c_str(), s.length());
            Obj sb;    const Obj& SB = sb;

            ASSERT(!SB.isValid());
            sb.reset(&fsb);
            ASSERT(SB.isValid());

            char buf[256];
            OT len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;

            ASSERT(len1 + len2 == len);
            ASSERT(s == buf);

            ASSERT(0 == SB.errorStatus());

            ASSERT(PT(len1) == sb.pubseekpos(len1));

            ASSERT(0 == SB.errorStatus());

            len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;

            ASSERT(0 == SB.errorStatus());

            ASSERT(len2 == len);
            ASSERTV(s.substr(len1), buf, s.substr(len1) == buf);

            PT pos = sb.pubseekoff(-len2, bsl::ios_base::cur);

            ASSERT(PT(len1) == sb.pubseekoff(0, bsl::ios_base::cur));
            ASSERTV(len1, pos, PT(len1) == pos);
            ASSERT(0 == SB.errorStatus());

            bsl::memset(buf, 0xaf, sizeof(buf));

            len = sb.sgetn(buf, sizeof(buf));
            buf[len] = 0;

            ASSERT(len2 == len);
            ASSERTV(s.substr(len1), buf, s.substr(len1) == buf);
            ASSERT(0 == SB.errorStatus());

            ASSERT(PT(len1 + len2) == sb.pubseekoff(0, bsl::ios_base::cur));
            ASSERT(0 == SB.errorStatus());

            ASSERT(ptZero == sb.pubseekpos(0));

            len = sb.sgetn(buf, len1);
            buf[len] = 0;

            ASSERT(len1 == len);
            ASSERT(bsl::string(line1) == buf);

            ASSERTV(PT(len1) == sb.pubseekoff(0, bsl::ios_base::cur));
            ASSERTV(SB.errorStatus(), 0 == SB.errorStatus());

            len = sb.sgetn(buf, len2);
            buf[len] = 0;

            ASSERT(len2 == len);
            ASSERT(bsl::string(line2) == buf);

            ASSERTV(PT(len1 + len2) == sb.pubseekoff(0, bsl::ios_base::cur));
            ASSERTV(SB.errorStatus(), 0 == SB.errorStatus());

            len = sb.sgetn(buf, 1);
            buf[len] = 0;

            ASSERT(0 == len);
            ASSERT(!*buf);
            ASSERT(0 == SB.errorStatus());

            ASSERT(PT(len1 + len2) == sb.pubseekoff(0, bsl::ios_base::cur));
            ASSERT(0 == SB.errorStatus());
        }
      } break;
      default: {
        cerr << "WARNING: CASE `" << test << "' NOT FOUND." << endl;
        testStatus = -1;
      }
    }

    if (testStatus > 0) {
        cerr << "Error, non-zero test status = " << testStatus << "."
             << endl;
    }
    return testStatus;
}

// ----------------------------------------------------------------------------
// Copyright 2020 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------
